Gin 如何应用中间件
Gin 支持三种级别的中间件应用能力:
- 全局,一般是通过
gin.Engine.Use()
来实现; - 路由组级别,通过
gin.Group.Use()
来实现; - 路由级别,通过
route.XXX()
方法的第二个和 Handler 之前的参数来实现。
Gin 提供了 gin.Engine.Use()
方法可以应用中间件,同时路由分组函数 route.Group()
返回的 gin.Group
也提供了应用中间件的能力。
也就是说,我们既可以使用 router.Use()
将中间件设置为全局的,也可以使用 v1.Use()
将中间件设置为分组级别的。
另外,所有的路由定义还提供了三个参数的变体,其中第二个参数用于应用中间件,也就是说还提供了路由级别的中间件能力
r.GET("/benchmark", MyBenchLogger(), benchEndpoint)
特别说明的是 gin.Default()
其实是由下面的代码封装而来
// 新建一个没有任何默认中间件的路由 r := gin.New() // 全局中间件 // Logger 中间件将日志写入 gin.DefaultWriter,即使你将 GIN_MODE 设置为 release。 // By default gin.DefaultWriter = os.Stdout r.Use(gin.Logger()) // Recovery 中间件会 recover 任何 panic。如果有 panic 的话,会写入 500。 r.Use(gin.Recovery())
将中间件应用到全局作用域
package main import ( "github.com/gin-gonic/gin" ) func main() { // 新建一个没有任何默认中间件的路由 r := gin.New() // 全局中间件 // Logger 中间件将日志写入 gin.DefaultWriter,即使你将 GIN_MODE 设置为 release。 // By default gin.DefaultWriter = os.Stdout r.Use(gin.Logger()) // Recovery 中间件会 recover 任何 panic。如果有 panic 的话,会写入 500。 r.Use(gin.Recovery()) // Listen and serve on 0.0.0.0:8080 r.Run(":8080") }
将中间件应用路由组作用域
package main import ( "github.com/gin-gonic/gin" ) func main() { r := gin.Default() // 认证路由组 // authorized := r.Group("/", AuthRequired()) // 和使用以下两行代码的效果完全一样: authorized := r.Group("/") // 路由组中间件! 在此例中,我们在 "authorized" 路由组中使用自定义创建的 // AuthRequired() 中间件 authorized.Use(AuthRequired()) { authorized.POST("/login", loginEndpoint) authorized.POST("/submit", submitEndpoint) authorized.POST("/read", readEndpoint) // // 嵌套路由组 testing := authorized.Group("testing") // visit 0.0.0.0:8080/testing/analytics testing.GET("/analytics", analyticsEndpoint) } // Listen and serve on 0.0.0.0:8080 r.Run(":8080") }
将中间件应用到路由作用域
package main import ( "github.com/gin-gonic/gin" ) func main() { r := gin.Default() // 路由定义,我们可以配置多个路由中间件。 r.GET("/benchmark", MyBenchLogger(), benchEndpoint) // Listen and serve on 0.0.0.0:8080 r.Run(":8080") }