gin中间件 | 青训营笔记

119 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第4篇笔记

1.什么是中间件(Middleware)

在Gin框架中,中间件是指可以拦截http请求-响应生命周期的特殊函数,在请求-响应生命周期中可以注册多个中间件,每个中间件执行不同的功能,一个中间执行完再轮到下一个中间件执行。

1.1自定义中间件

中间件需要返回gin.HandlerFunc类型

一边中间件的形式:

func myMiddleWare() gin.HandlerFunc { 
    return func(c *gin.Context) {
    //....
    } 
}

而且在中间件有个Next函数,使用Next函数可以对请求放行,当执行结束后再反过来执行Next函数后的代码。Next函数是在请求前执行,而Next函数后是在请求后执行。

举个例子:

func MiddleWare() gin.HandlerFunc {
    return func(c *gin.Context) {
    
        fmt.Println("中间件开始执行了")
        // 执行函数
        c.Next()
        // 中间件执行完后续的一些事情
        fmt.Println("中间件执行完毕")

    }
}

2. 中间件的分类:

gin中的中间件大致分为俩类:全局中间件局部中间件

2.1全局中间件

全局中间件会拦截所有请求,例子如下:

// 定义中间
func myMiddleWare() gin.HandlerFunc {
    return func(c *gin.Context) {
        t := time.Now()
        fmt.Println("中间件开始执行了")
        // 设置变量到Context的key中,可以通过Get()取
        c.Set("request", "中间件")
        status := c.Writer.Status()
        fmt.Println("中间件执行完毕", status)
        t2 := time.Since(t)
        fmt.Println("time:", t2)
    }
}

func main() {
    r := gin.Default()
    r.Use(MiddleWare())
    r.GET("/ce", func(c *gin.Context) {
        req, _ := c.Get("request")
        fmt.Println("request:", req)
        c.JSON(200, gin.H{"request": req})
    })
    r.Run()
}

2.1.1默认中间件

当我们创建路由时调用:

 router := gin.Default()

打开Default源码可以看到

 func Default() *Engine {
 debugPrintWARNINGDefault()
 engine := New()
 engine.Use(Logger(), Recovery())
 return engine
 }

在源码中,时=是默认使用了Logger和Recovery两个中间件。
两者的作用:

  • Logger是对日志进行记录
  • Recovery是对有painc时, 返回500的错误处理

2.2 局部中间件

顾名思义,可针对特定路由设置特定的中间件

// 定义中间
func myMiddleWare() gin.HandlerFunc {
    return func(c *gin.Context) {
        t := time.Now()
        fmt.Println("中间件开始执行了")
        // 设置变量到Context的key中,可以通过Get()取
        c.Set("request", "中间件")
        // 执行函数
        c.Next()
        status := c.Writer.Status()
        fmt.Println("中间件执行完毕", status)
        t2 := time.Since(t)
        fmt.Println("time:", t2)
    }
}

func main() {
    r := gin.Default()
    //局部中间键使用
    r.GET("/ce", MiddleWare(), func(c *gin.Context) {
        req, _ := c.Get("request")
        fmt.Println("request:", req)
        c.JSON(200, gin.H{"request": req})
    })
    r.Run()
}

3.优秀的中间件推荐:

中间件推荐 · Go语言中文文档 (topgoer.com)