中间件其实是一个方法,
在.use就可以调用中间件函数
r := gin.Default()
v1 := r.Group("v1")
//v1 := r.Group("v1").Use()
v1.GET("test", func(c *gin.Context) {
fmt.Println("get into the test")
c.JSON(200, gin.H{
"success": true, //返回一对键值对
})
})
r.Run(":8080")
}
之后我们再来看Use方法,用来使用中间件
// Use adds middleware to the group, see example code in GitHub.
func (group *RouterGroup) Use(middleware ...HandlerFunc) IRoutes {
group.Handlers = append(group.Handlers, middleware...)
return group.returnObj()
}
type HandlerFunc func(*Context)//HandlerFunc就是一个接受了参数为*Context的函数
//在实际过程中是我们返回一个函数作为结果
说一下中间件的顺序
和洋葱中间件是差不多的
func middle() gin.HandlerFunc {
return func(c *gin.Context) {
fmt.Println("我在方法前,1")
c.Next()
fmt.Println("我在方法后,1")
}
}
func middleTwo() gin.HandlerFunc {
return func(c *gin.Context) {
fmt.Println("我在方法前,2")
c.Next()
fmt.Println("我在方法后,2")
}
}
func main() {
r := gin.Default()
v1 := r.Group("v1").Use(middle(), middleTwo())
/*
首先执行middle()
c.Next()
执行middleTwo()
在middleTwo内部也有c.Next()
这个时候发现没有了
往下面执行,这个就是core
执行完之后执行
middleTwo()
然后再执行middle()
*/
v1.GET("test", func(c *gin.Context) {
fmt.Println("我在分组方法内部")
c.JSON(200, gin.H{
"success": true, //返回一对键值对
})
})
r.Run(":8080")
}
中间件还有一种调用方式,链式调用方式
v1 := r.Group("v1").Use(middle(),middleTwo())
效果是一样的