1.中间件
中间件也叫拦截器或者过滤器,这些中间件会在路由之前执行,以此完成一些特定功能,比如打印日志啊、登录认证、权限认证、错误返回等。
2.全局中间件
注册全局中间件后,此路由所有接口执行之前都会执行此中间件
// 定义中间
func MIddle1() gin.HandlerFunc {
return func(c *gin.Context) {
fmt.Println("中间件开始执行了")
// 设置变量到Context的key中,可以通过Get()取
c.Set("request", "中间件")
status := c.Writer.Status()
fmt.Println("中间件执行完毕", status)
}
}
func main() {
// 1.创建路由
r := gin.Default()
// 注册中间件
r.Use(MIddle1())
{
r.GET("/middle", func(c *gin.Context) {
fmt.Println("middleq请求")
// 取值
req, _ := c.Get("request")
fmt.Println("request:", req)
// 页面接收
c.JSON(200, gin.H{"request": req})
})
}
r.Run()
}
3.局部中间件
局部中间件只会在本接口执行之前执行此中间件
// 定义中间
func MIddle1() gin.HandlerFunc {
return func(c *gin.Context) {
fmt.Println("中间件开始执行了")
// 设置变量到Context的key中,可以通过Get()取
c.Set("request", "中间件")
status := c.Writer.Status()
fmt.Println("中间件执行完毕", status)
}
}
func main() {
// 1.创建路由
r := gin.Default()
{
r.GET("/middle",MIddle1(), func(c *gin.Context) {
fmt.Println("middleq请求")
// 取值
req, _ := c.Get("request")
fmt.Println("request:", req)
// 页面接收
c.JSON(200, gin.H{"request": req})
})
}
r.Run()
}
4.c.Next()函数介绍
如果中间件调用了c.Next(),这意味着在c.Next()后会将请求处理程序传递给下一个中间件或者http请求,等到下个步骤处理完成后再回到c.Next()函数后执行
1).在一个中间函数中添加c.Next()
2).在多个中间函数中全部添加c.Next()
3).在多个中间函数中部分添加c.Next()
代码:
// 1号中间
func MIddle1(c *gin.Context) {
fmt.Println("MIddle1中间件开始执行了")
c.Next()
fmt.Println("MIddle1中间件执行完毕")
}
// 2号中间
func MIddle2(c *gin.Context) {
fmt.Println("MIddle2中间件开始执行了")
c.Next()
fmt.Println("MIddle2中间件执行完毕")
}
// 3号中间
func MIddle3(c *gin.Context) {
fmt.Println("MIddle3中间件开始执行了")
c.Next()
fmt.Println("MIddle3中间件执行完毕")
}
func main() {
// 1.创建路由
r := gin.Default()
r.Use(MIddle1,MIddle2,MIddle3)
{
r.GET("/middle", func(c *gin.Context) {
fmt.Println("middle处理")
// 页面接收
c.JSON(200, gin.H{"request": "ok"})
})
}
r.Run()
}