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