Gin 框架怎么使用中间件?

教育   2024-12-09 08:28   北京  

欢迎点击下方👇关注我,记得星标哟~

文末会有重磅福利赠送

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,备注:面试群。

点击下方文章,看看他们是怎么找到好工作的!

Go就业陪跑训练营,辅导到就业为止!

Java就业陪跑训练营,辅导到就业为止!

我们又出成绩啦!大厂Offer集锦!遥遥领先!

王中阳
公司技术总监,创办就业陪跑服务,辅导学员拿到600多个offer。专注程序员的就业辅导、简历优化、模拟面试等。
 最新文章