gin中間件
1.gin可以構(gòu)建中間件,但它只對注冊過的路由函數(shù)起作用
2.對于分組路由,嵌套使用中間件,可以限定中間件的作用范圍
3.中間件分為全局中間件,單個路由中間件和群中間件
4.gin中間件必須是一個gin.HandlerFunc類型

中間件.png
######### 應(yīng)用
登錄、權(quán)限
全局中間件
所有請求都經(jīng)過此中間件
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"time"
)
// 定義中間件
func MiddleWare()gin.HandlerFunc{
return func(c *gin.Context) {
t:=time.Now()
fmt.Println("中間件開始執(zhí)行了")
// 設(shè)置變量到Context的key中,可以通過Get()取
c.Set("request","中間件")
// 執(zhí)行中間件
c.Next()
// 響應(yīng)
status := c.Writer.Status()
fmt.Println("中間件執(zhí)行完成",status)
t2:= time.Since(t)
fmt.Println("time:",t2)
}
}
func main() {
// 1. 創(chuàng)建路由器
r := gin.Default()
// 1.注冊中間件
r.Use(MiddleWare())
// {}為了代碼規(guī)范
{
r.GET("/middleware", func(c *gin.Context) {
// 取值
req,_:=c.Get("request")
fmt.Println("request:",req)
// 頁面接收
c.JSON(200,gin.H{"request:":req})
})
}
// 3.監(jiān)聽端口,默認8080
r.Run(":8000")
}

結(jié)果.png

終端.png
Next()方法
看源碼

next.png
遍歷了handle
全局中間件和局部中間件
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"time"
)
// 定義中間件
func MiddleWare()gin.HandlerFunc{
return func(c *gin.Context) {
t:=time.Now()
fmt.Println("中間件開始執(zhí)行了")
// 設(shè)置變量到Context的key中,可以通過Get()取
c.Set("request","中間件")
// 執(zhí)行中間件
c.Next()
// 響應(yīng)
status := c.Writer.Status()
fmt.Println("中間件執(zhí)行完成",status)
t2:= time.Since(t)
fmt.Println("time:",t2)
}
}
func main() {
// 1. 創(chuàng)建路由器
r := gin.Default()
// 1.注冊中間件
r.Use(MiddleWare())
// {}為了代碼規(guī)范
{
r.GET("/middleware", func(c *gin.Context) {
// 取值
req,_:=c.Get("request")
fmt.Println("request:",req)
// 頁面接收
c.JSON(200,gin.H{"request:":req})
})
// 根據(jù)路由后面定義的局部中間件
r.GET("/middleware2", MiddleWare(),func(c *gin.Context) {
// 取值
req,_:=c.Get("request")
fmt.Println("request:",req)
// 頁面接收
c.JSON(200,gin.H{"request:":req})
})
}
// 3.監(jiān)聽端口,默認8080
r.Run(":8000")
}