首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Gin 框架怎么使用中间件?

Gin 框架怎么使用中间件?

作者头像
frank.
发布2024-12-09 13:48:25
发布2024-12-09 13:48:25
30600
代码可运行
举报
运行总次数:0
代码可运行

01 、介绍

在 Gin 框架中,HTTP 请求可以由一系列中间件和最终操作来处理。

本文我们介绍怎么使用中间件。

02 、使用中间件

Gin 框架使用中间件,分为全局中间件、路由中间件、路由组中间件。

示例代码:

代码语言:javascript
代码运行次数:0
运行
复制
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 的源码。

代码语言:javascript
代码运行次数:0
运行
复制
// 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() 方法,会先调用后续的处理函数,最后再执行完当前函数的代码。

自定义中间件:

代码语言:javascript
代码运行次数:0
运行
复制
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")
 }
}

输出结果:

代码语言:javascript
代码运行次数:0
运行
复制
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() 方法的执行顺序。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-12-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言开发栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档