全局中间件
所有请求都经过此中间件
package mainimport ("fmt""time""github.com/gin-goinc/gin")// define middlewarefunc Middleware() gin.HandlerFunc {return func(c *gin.Context) {t := time.Now()fmt.Println("middleware start")// set variable into Contextc.Set("foo", "bar")status := c.Writer.Status()fmt.Println("middleware finish", status)t2 := time.Since(t)fmt.Println("time:", t2)}}func main() {r := gin.Default()r.Use(Middleware()){r.GET("/test", func(c *gin.Context) {// get variablereq, _ := c.Get("foo")fmt.Println("foo", req)c.JSON(200, gin.H{"foo": req})})}r.Run()}
输出
middleware startmiddleware finishtime: 0 sfoo: bar
代码中计算时间差没有执行?(我感觉是执行了,先把中间件里面的都走完,再走具体的函数)
Next()方法
package mainimport ("fmt""time""github.com/gin-goinc/gin")// define midllewarefunc MiddleWare() gin.HandlerFunc {return func(c *gin.Context) {t := time.Now()fmt.Println("middleware start")// set variablec.Set("foo", "bar")// execute functionc.Next()// something execute after functionstatus := c.Writer.Status()fmt.Println("middleware finsih", status)t2 := time.Since(t)fmt.Println("time:", t2)}}func main() {r := gin.Default()r.Use(MiddleWare()){r.GET("/test", func(c *gin.Context) {req, _ := c.Get("foo")fmt.Println("foo:", req)c.JSON(200, gin.H{"foo:": req})})}r.Run()}
输出
middleware startfoo: barmiddleware finishtime: 998.6 μs
走到先走中间件的前几句,遇到Next()转而去执行具体的函数,执行完回来继续执行剩余的中间件代码,类似 中断操作?
局部中间件
与全局中间不同的地方在于使用方式,定义是一样的
package mainimport ("fmt""time""github.com/gin-gonic/gin")// define middlewarefunc MiddleWare() gin.HandlerFunc {return func(c *gin.Context) {t := time.Now()fmt.Println("middleware start")c.Set("foo", "bar")c.Next()status := c.Writer.Status()fmt.Println("middleware finsih", status)t2 := time.Since(t)fmt.Println("time:", t2)}}func main() {r := gin.Default()// 中间件在局部使用r.GET("/text", Middleware(), func(c *gin.Context) {req, _ := c.Get("foo")fmt.Println("foo:", req)c.JSON(200, gin.H{"foo": bar})})r.Run()}
