What is a Routing Group?
From the literal meaning, a routing group refers to a group of routes. So what kind of routes can be classified into a group? In actual use, the more common scenario is to group according to the version. Such as the following figure:
Use Grammar
A function is provided in the Gin
framework to Group
manage routes in groups. The usage syntax is as follows:
v1 := engine . Group ( "v1" )
{
v1 . GET ( "/path/xxx" , func ( context * gin . Context ) {
...
})
v1 . POST ( "/user/xxx" , func ( context * gin . Context ) {
...
})
}
api := engine . Group ( "api" )
{
user := api . Group ( "user" )
{
user . GET ( "path" , func ( context * gin . Context ) {
...
})
user . POST ( "path" , func ( context * gin . Context ) {
...
})
}
}
Multi-version Combat (without nested routing)
Code example
//-- main.go -------
package main
import (
"github.com/gin-gonic/gin" // Import Gin framework
"go_use/practise" // Code sample package
)
func main () {
// create a default routing engine
engine := gin . Default ()
// register routes
practise . TestRouteGroup ( engine )
_ = engine . Run ( ":9090" )
}
//--- go_use/practise/routing_use.go -------
// --- routing group using
func TestRouteGroup ( engine * gin . Engine ) {
// routing group A (v1 version)
v1 : = engine . Group ( "v1" )
{
v1 . GET ( "/user/login" , func ( context * gin . Context ) {
context . JSON ( 200 , gin . H { "msg" : "v1-login successful" })
})
v1 . GET ( "/user/register" , func ( context * gin . Context ) {
context . JSON ( 200 , gin . H { "msg" : "v1-registered successfully" })
})
v1 . GET ( "/user/del" , func ( context * gin . Context ) {
context . JSON ( 200 , gin . H { "msg" : "v1-logout successful" })
})
}
// routing group B (v2 version)
v2 := engine . Group ( "v2" )
{
v2 . GET ( "/user/login" , func ( context * gin . Context ) {
context . JSON ( 200 , gin . H { "msg" : "v2-login successful" })
})
v2 . GET ( "/user/out" , func ( context * gin . Context ) {
context . JSON ( 200 , gin . H { "msg" : "v2-user logout" })
})
}
}
[ GIN-debug] [ WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[ GIN-debug] [ WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env : export GIN_MODE = release
- using code: gin.SetMode( gin.ReleaseMode)
#Registered routes are as follows
[ GIN-debug] GET /v1/user/login -- > go_use/practise.TestRouteGroup.func1 ( 3 handlers)
[ GIN-debug] GET /v1/user/register -- > go_use/practise.TestRouteGroup.func2 ( 3 handlers)
[ GIN-debug] GET /v1/user/del -- > go_use/practise.TestRouteGroup.func3 ( 3 handlers)
[ GIN-debug] GET /v2/user/login -- > go_use/practise.TestRouteGroup.func4 ( 3 handlers)
[ GIN-debug] GET /v2/user/out -- > go_use/practise.TestRouteGroup.func5 ( 3 handlers)
[ GIN-debug] Environment variable PORT is undefined. Using port :9090 by default
[ GIN-debug] Listening and serving HTTP on :9090
$ curl -X GET http://127.0.0.1:9090/v1/user/login
{ "msg" : "v1-login successful" }
$ curl -X GET http://127.0.0.1:9090/v1/user/register
{ "msg" : "v1-registered successfully" }
$ curl -X GET http://127.0.0.1:9090/v1/user/del
{ "msg" : "v1-logout successful" }
$ curl -X GET http://127.0.0.1:9090/v2/user/login
{ "msg" : "v2-login successful" }
$ curl -X GET http://127.0.0.1:9090/v2/user/out
{ "msg" : "v2-user-logout" }
$ curl -X GET http://127.0.0.1:9090/v2/user/del
404 page not found
Through the above example, we confirmed the Gin
framework can perform routing grouping by version, it does not support API version inheritance, such as accessing: http://127.0.0.1:9090/v2/user/del, expecting to return{“msg”:”v1-logout successful”}
Module separation (nested routing)
//-- main.go -------
package main
import (
"go_use/practise"
"github.com/gin-gonic/gin"
)
func main () {
// Create a default routing engine
engine := gin . Default ()
// Register route
practise . TestRouteGroupNested ( engine )
_ = engine . Run ( ":9090" )
}
//--- go_use/practise/routing_use.go -------
// Route Nested Groups
func TestRouteGroupNested ( engine * gin . Engine ) {
// Interface
api := engine . Group ( "api" )
{
user := api . Group ( "user" )
{
user . GET ( "login" , func ( context * gin . Context ) {
context . JSON ( 200 , gin . H { "msg" : "api-login successful" })
})
}
}
// Backstage
admin := engine . Group ( "admin" )
{
user := admin . Group ( "user" )
{
user . GET ( "login" , func ( context * gin . Context ) {
context . JSON ( 200 , gin . H { "msg" : "admin-login successful" })
})
}
}
}
[ GIN-debug] [ WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[ GIN-debug] [ WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env : export GIN_MODE = release
- using code: gin.SetMode( gin.ReleaseMode)
#Registered routes are as follows
[ GIN-debug] GET /api/user/login -- > go_use/practise.TestRouteGroupNested.func1 ( 3 handlers)
[ GIN-debug] GET /admin/user/login -- > go_use/practise.TestRouteGroupNested.func2 ( 3 handlers)
[ GIN-debug] Environment variable PORT is undefined. Using port :9090 by default
[ GIN-debug] Listening and serving HTTP on :9090
$ curl - X GET http: //127.0.0.1:9090/api/user/login
{ "msg" : "api-login successful" }
$ curl - X GET http: //127.0.0.1:9090/admin/user/login
{ "msg" : "admin-login successful" }