Gin 框架怎么使用中间件?

开发 前端
本文我们介绍 Gin 框架怎么使用中间件,包括全局中间件、路由中间件、路由组中间件。我们还介绍了怎么自定义中间件,以及中间件使用的 c.Next() 方法的执行顺序。

1.介绍

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

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

2.使用中间件

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 方法,使用中间件,包含默认中间件和自定义中间件。

3.自定义中间件

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() 方法之后的代码。

4.总结

本文我们介绍 Gin 框架怎么使用中间件,包括全局中间件、路由中间件、路由组中间件。

我们还介绍了怎么自定义中间件,以及中间件使用的 c.Next() 方法的执行顺序。

责任编辑:武晓燕 来源: Golang语言开发栈
相关推荐

2024-02-06 14:05:00

Go中间件框架

2024-07-29 00:01:00

2021-10-06 19:03:35

Go中间件Middleware

2020-12-14 09:12:53

Golang GinJsonWebToke前后端

2020-08-19 08:39:05

中间件前端设计模式

2011-05-24 15:10:48

2021-02-11 08:21:02

中间件开发CRUD

2018-07-29 12:27:30

云中间件云计算API

2018-02-01 10:19:22

中间件服务器系统

2022-11-18 07:54:02

Go中间件项目

2016-11-11 21:00:46

中间件

2012-11-30 10:21:46

移动中间件

2009-06-16 15:55:06

JBoss企业中间件

2023-06-29 10:10:06

Rocket MQ消息中间件

2023-10-24 07:50:18

消息中间件MQ

2012-11-01 15:16:22

金蝶中间件研究院院长

2021-06-15 10:01:02

应用系统软件

2022-12-26 00:00:01

Go框架前端

2018-05-08 16:33:31

中间件RPC企业

2018-05-02 16:23:24

中间件RPC容器
点赞
收藏

51CTO技术栈公众号