感觉中间件是gin中挺重要的内容,就拿出来单独讲讲吧!
什么是中间件?
Gin框架允许开发者在处理请求的过程中,加入用户自己的 HandlerFunc 函数。
它适合处理一些公共的业务逻辑,比如登录认证、权限校验、数据分页、记录日志、耗时统计等。
也就是我们这里说的中间件。
必须是一个gin.HandlerFunc
类型,即func(* Context)类型。
// HandlerFunc defines the handler used by gin middleware as return value. type HandlerFunc func(*Context)
自定义中间件
定义中间件:
func myHandler() gin.HandlerFunc {
return func(c *gin.Context) {
startTime := time.Now()
c.Next()
endTime := time.Now()
duration := endTime.Sub(startTime)
fmt.Println(duration)
}
}
中间件的使用:
注册全局路由,所有的请求都会经过这里来处理,打印出访问时间。
router.Use(myHandler())
为某个路由单独注册中间件
router.GET("/example", myHandler(), func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{})
})
为路由组注册中间件
func Group(router *gin.Engine) {
userGroup := router.Group("/user")
userGroup.Use(MyHandler())
{ //习惯性一对`{}`包裹同组的路由,这只是为了看着清晰,你用不用`{}`包裹功能上没什么区别
userGroup.GET("/1", func(c *gin.Context) {}) // /user/1
userGroup.GET("/2", func(c *gin.Context) {}) // /user/2
userGroup.GET("/3", func(c *gin.Context) {}) // /user/3
}
}
中间件的使用顺序
在 Gin 中,中间件是按照注册的顺序依次执行的。如果中间件 A 注册在 B 之前,那么 A 会在 B 之前执行;调用c.next() 后,将执行下一个中间件,如果 c.Abort() 被调用,后续中间件将不会执行。
gin默认中间键
gin.Default()
默认使用了Logger
和Recovery
中间件,其中:
Logger
中间件将日志写入gin.DefaultWriter
,即使配置了GIN_MODE=release
。Recovery
中间件会recover任何panic
。如果有panic的话,会写入500响应码。
如果不想使用上面两个默认的中间件,可以使用gin.New()
新建一个没有任何默认中间件的路由。
本来想着挺重要的,就单独写了,学了一遍之后发现很简单,可能是因为我之前学过吧,之前那遍挺蒙的,就觉得难了,回头再看其实不难。 这篇文章比我写的好写的全,十分推荐:【Golang】——Gin 框架中间件详解:从基础到实战_gin 中间件-CSDN博客