欢迎点击下方👇关注我,记得星标哟~
文末会有重磅福利赠送
01
介绍
在 Gin 框架中,HTTP 请求可以由一系列中间件和最终操作来处理。
本文我们介绍怎么使用中间件。
02
使用中间件
Gin 框架使用中间件,分为全局中间件、路由中间件、路由组中间件。
示例代码:
func main() {
// 新建一个没有任何默认中间件的路由
r := gin.New()
// 全局中间件
r.Use(gin.Logger())
r.Use(gin.Recovery())
// 路由中间件
r.GET("/benchmark", MyBenchLogger(), benchEndpoint))
// 路由组中间件
authorized := r.Group("/")
authorized.Use(AuthRequired())
{
authorized.POST("/login", loginEndpoint)
authorized.POST("/submit", submitEndpoint)
authorized.POST("/read", readEndpoint)
// 嵌套路由组
testing := authorized.Group("testing")
testing.GET("/analytics", analyticsEndpoint)
}
r.Run(":8080")
}
阅读上面这段代码,我们可以发现,Gin 框架使用 Use 方法,使用中间件,包含默认中间件和自定义中间件。
03
自定义中间件
Gin 框架除了使用默认中间件,还可以自定义中间件。
我们先阅读默认中间件 Recovery 的源码。
// Recovery returns a middleware that recovers from any panics and writes a 500 if there was one.
func Recovery() HandlerFunc {
return RecoveryWithWriter(DefaultErrorWriter)
}
// RecoveryWithWriter returns a middleware for a given writer that recovers from any panics and writes a 500 if there was one.
func RecoveryWithWriter(out io.Writer, recovery ...RecoveryFunc) HandlerFunc {
if len(recovery) > 0 {
return CustomRecoveryWithWriter(out, recovery[0])
}
return CustomRecoveryWithWriter(out, defaultHandleRecovery)
}
阅读默认中间件 Recovery 的源码,我们可以发现,Gin 框架中间件,就是一个有 HandlerFunc
类型返回值的函数。
我们阅读 CustomRecoveryWithWriter
函数的源码,可以发现 c.Next()
方法,该方法只在中间件内部使用。
它的作用是,当代码执行到 c.Next()
方法,会先调用后续的处理函数,最后再执行完当前函数的代码。
自定义中间件:
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{
"ping": "pong",
})
}, MyMiddleware1(), MyMiddleware2())
err := r.Run(":8080")
if err != nil {
return
}
}
func MyMiddleware1() gin.HandlerFunc {
return func(c *gin.Context) {
fmt.Println("abc")
defer func() {
fmt.Println("def")
}()
c.Next()
fmt.Println("ghi")
}
}
func MyMiddleware2() gin.HandlerFunc {
return func(c *gin.Context) {
fmt.Println("111")
defer func() {
fmt.Println("222")
}()
c.Next()
fmt.Println("333")
}
}
输出结果:
curl -s -X GET http://127.0.0.1:8080 | jq
{
"ping": "pong"
}
abc
111
333
222
ghi
def
阅读上面这段代码,我们定义三个中间件函数,其中每个中间件函数中都使用 c.Next()
方法。
通过输出结果,我们可以发现,代码执行顺序是,先正序分别执行三个中间件的 c.Next()
方法之前的代码。
然后,再倒序分别执行三个中间件 c.Next()
方法之后的代码。
04
总结
本文我们介绍 Gin 框架怎么使用中间件,包括全局中间件、路由中间件、路由组中间件。
我们还介绍了怎么自定义中间件,以及中间件使用的 c.Next()
方法的执行顺序。
早日上岸!
我们搞了一个免费的面试真题共享群,互通有无,一起刷题进步。
没准能让你能刷到自己意向公司的最新面试题呢。
感兴趣的朋友们可以加我微信:wangzhongyang1993,备注:面试群。
点击下方文章,看看他们是怎么找到好工作的!