这是我参与「第三届青训营 -后端场」笔记创作活动的第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()
}