Gin 框架 -四-: 路由組

1. 什麼是路由組?

從字面意思理解, 路由組指的就是一組路由。那麼什麼樣的路由可以歸類到一組呢?在實際使用中,比較常見的場景的是根據版本分組。比如下圖

  1. 使用語法

Gin框架中提供了一個函數Group可以將路由進行分組管理。使用語法如下:

a. 不嵌套分組:

v1 := engine.Group("v1")
{ 
 v1.GET("/path/xxx", func(context *gin.Context) {
  ...
 })
 v1.POST("/user/xxx", func(context *gin.Context) {
  ...
 })
}

b. 嵌套分組:

api := engine.Group("api")
{
 user := api.Group("user")
 {
  user.GET("path", func(context *gin.Context) {
   ...
  })
    user.POST("path", func(context *gin.Context) {
   ...
  })
 }
}

3. 多版本實戰 (不嵌套路由)

3.1 代碼示例

//-- main.go -------
package main
import (
 "github.com/gin-gonic/gin" // 引入Gin框架
 "go-use/practise" // 代碼示例包
)
func main() {
 // 創建一個默認的路由引擎
 engine := gin.Default()
 // 註冊路由
 practise.TestRouteGroup(engine)
 _ = engine.Run()
}
//--- go-use/practise/routing_use.go -------
// --- 路由組使用
func TestRouteGroup(engine *gin.Engine) {
 // 路由組A(v1版本)
 v1 := engine.Group("v1")
 {
  v1.GET("/user/login", func(context *gin.Context) {
   context.JSON(200, gin.H{"msg""v1-登錄成功"})
  })
  v1.GET("/user/register", func(context *gin.Context) {
   context.JSON(200, gin.H{"msg""v1-註冊成功"})
  })
  v1.GET("/user/del", func(context *gin.Context) {
   context.JSON(200, gin.H{"msg""v1-註銷成功"})
  })
 }
 // 路由組B(v2版本)
 v2 := engine.Group("v2")
 {
  v2.GET("/user/login", func(context *gin.Context) {
   context.JSON(200, gin.H{"msg""v2-登錄成功"})
  })
  v2.GET("/user/out", func(context *gin.Context) {
   context.JSON(200, gin.H{"msg""v2-用戶退出"})
  })
 }
}

3.2 服務啓動

[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)
# 註冊的路由如下
[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 :8080 by default
[GIN-debug] Listening and serving HTTP on :8080

3.3 請求返回

➜ curl -X GET http://127.0.0.1:8080/v1/user/login
{"msg":"v1-登錄成功"}
➜ curl -X GET http://127.0.0.1:8080/v1/user/register
{"msg":"v1-註冊成功"}
➜ curl -X GET http://127.0.0.1:8080/v1/user/del
{"msg":"v1-註銷成功"}
➜ curl -X GET http://127.0.0.1:8080/v2/user/login
{"msg":"v2-登錄成功"}
➜ curl -X GET http://127.0.0.1:8080/v2/user/out
{"msg":"v2-用戶退出"}
➜ curl -X GET http://127.0.0.1:8080/v2/user/del
404 page not found

通過上面示例發現:Gin框架雖然可以通過版本進行路由分組,但是不支持 API 版本繼承, 比如訪問: http://127.0.0.1:8080/v2/user/del, 期望返回{"msg":"v1-註銷成功"}

4. 模塊分離 (嵌套路由)

4.1 代碼示例

//-- main.go -------
package main
import (
 "github.com/gin-gonic/gin"
 "go-use/practise"
)
func main() {
 // 創建一個默認的路由引擎
 engine := gin.Default()
 // 註冊路由
 practise.TestRouteGroupNested(engine)
 _ = engine.Run()
}
//--- go-use/practise/routing_use.go -------
// 路由嵌套分組
func TestRouteGroupNested(engine *gin.Engine) {
 // 接口
 api := engine.Group("api")
 {
  user := api.Group("user")
  {
   user.GET("login", func(context *gin.Context) {
    context.JSON(200, gin.H{"msg""api-登錄成功"})
   })
  }
 }
 // 後臺
 admin := engine.Group("admin")
 {
  user := admin.Group("user")
  {
   user.GET("login", func(context *gin.Context) {
    context.JSON(200, gin.H{"msg""admin-登錄成功"})
   })
  }
 }
}

4.2 服務啓動

[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)
# 註冊的路由如下
[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 :8080 by default
[GIN-debug] Listening and serving HTTP on :8080

4.3 請求返回

➜ curl -X GET http://127.0.0.1:8080/api/user/login
{"msg":"api-登錄成功"}
➜ curl -X GET http://127.0.0.1:8080/admin/user/login
{"msg":"admin-登錄成功"}
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/aPonQZSaCxEluLEpBFF4lw