五、 gin中间件
- gin可以构建中间件,但它支对注册过的路由函数起作用
- 对于分组路由,嵌套使用中间件,可以限定中间件的作用范围
- 中间件分为全局中间件,单个路由中间件和群组中间件
- gin中间件必须是一个 gin.HandlerFunc类型
1. 全局中间件
-
所有的请求都经过该中间件
关键函数: func middleWareXXX() gin.HandlerFunc{} c.Next()
后台代码func main() { //创建默认路由 r := gin.Default() r.Use(middleWare()) // {}为了规范代码 { r.GET("/middleware", func(c *gin.Context) { // 取值 req, _ := c.Get("request") fmt.Println("request:", req) c.JSON(http.StatusOK, gin.H{ "request": req, }) }) } r.Run(":8000") } func middleWare() 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) } }
2. Next()方法
-
源码
func (c *Context) Next() { c.index++ for c.index < int8(len(c.handlers)) { c.handlers[c.index](c) c.index++ } }
3. 局部中间件
-
只对当前的路由起作用
后台代码r.GET("/middleware", middleWare(), func(c *gin.Context) { // 取值 req, _ := c.Get("request") fmt.Println("request:", req) c.JSON(http.StatusOK, gin.H{ "request": req, }) }
4. 中间件练习
-
示例代码
func middleWare() gin.HandlerFunc { return func(c *gin.Context) { t := time.Now() c.Next() t2 := time.Since(t) fmt.Println("time: ", t2) } }