gin中间件

五、 gin中间件
  • gin可以构建中间件,但它支对注册过的路由函数起作用
  • 对于分组路由,嵌套使用中间件,可以限定中间件的作用范围
  • 中间件分为全局中间件,单个路由中间件和群组中间件
  • gin中间件必须是一个 gin.HandlerFunc类型

1. 全局中间件

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)
	}
}