中间件解析
每个中间件是独立的,可以多个中间件组成一个链状的结构,让request请求流水线般的进行拦截处理。

除了内置的中间件r := gin.Default()
中的日志中间件Logger()
和 恢复错误现场中间件Recovery()
之外,还可以自定义中间件,比如:
func TimeCostMiddleware(c *gin.Context) {
t := time.Now()
c.Next()
t2 := time.Since(t)
log.Println(t2)
}
复制代码
按类型分为全局中间件和局部中间件
-
注册为全局中间件,使用func (engine *Engine) Use(middleware ...HandlerFunc)
,同时也能使用该函数对路由组进行注册;
package main
import (
"github.com/gin-gonic/gin"
"log"
"net/http"
"time"
)
func main() {
r := gin.Default()
r.Use(TimeCostMiddleware)
r.GET("/hello", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "hello",
})
})
_ = r.Run(":8080")
}
func TimeCostMiddleware(c *gin.Context) {
t := time.Now()
c.Next()
t2 := time.Since(t)
log.Println("耗时", t2)
}
复制代码
2021/09/01 11:37:33 耗时 0s
[GIN] 2021/09/01 - 11:37:33 |?[97;42m 200 ?[0m| 26ms | ::1 |?[97;44m GET ?[0m "/hello"
复制代码
-
注册为局部中间件,直接写入函数入口参数中,中间件的本质也是HandlerFunc
,同时对路由组也能写入入口参数中也能实现这个效果:
package main
import (
"github.com/gin-gonic/gin"
"log"
"net/http"
"time"
)
func main() {
r := gin.Default()
r.GET("/hello", TimeCostMiddleware, func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "hello",
})
})
_ = r.Run(":8080")
}
func TimeCostMiddleware(c *gin.Context) {
t := time.Now()
c.Next()
t2 := time.Since(t)
log.Println("耗时", t2)
}
复制代码