很多Web框架都有MiddleWare(中间件)的概念,Gin框架中的中间件能在具体的处理函数执行前和执行后运行一些代码逻辑。中间件可以实现统一的认证鉴权、日志记录、请求信息统计等功能。Gin提供了一些内置的中间件,很多Gin的扩展都是使用中间件实现的,我们具体开发时很多业务逻辑也需要我们自定义中间件。
前面我们编写的代码中都用到了gin.Default()
来初始化Gin框架,实际上这个Default()
方法就会加载2个默认的中间件:Logger和Recovery。
下面例子中我们自定义了一个DemoMiddleWare
,它在具体的处理函数执行前后打印了一些信息。
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func DemoMiddleWare(context *gin.Context) {
fmt.Println("处理函数执行前")
context.Next()
fmt.Println("处理函数执行后")
}
func main() {
engine := gin.Default()
engine.GET("/", DemoMiddleWare, func(context *gin.Context) {
fmt.Println("处理函数执行了")
})
err := engine.Run(":8080")
if err != nil {
fmt.Println(err)
return
}
}
我们可以发现,其实处理函数和中间件都是gin.HandlerFunc
类型的,只不过它们逻辑上的作用位置不同,中间件是可复用的,可以配置在全局、路由组或是某些路由上,而处理函数一般对应一个路由。
中间件的代码中,我们调用了context.Next()
方法,它代表其它处理逻辑的执行,以此实现在处理函数后插入逻辑;此外中间件里还可以使用Abort()
方法终止后续处理,用于例如权限验证不通过这类需求场景。
中间件可以配置为全局、路由组和路由上生效。
配置为全局中间件例子如下:
engine.Use(DemoMiddleWare)
配置为路由组中间件例子如下:
group := engine.Group("/api/v1", DemoMiddleWare)
配置为路由中间件例子如下:
engine.GET("/", DemoMiddleWare, func(context *gin.Context) {}