Gin 框架 -四-: 路由組
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