全局中间件
所有请求都经过此中间件
package main
import (
"fmt"
"time"
"github.com/gin-goinc/gin"
)
// define middleware
func Middleware() gin.HandlerFunc {
return func(c *gin.Context) {
t := time.Now()
fmt.Println("middleware start")
// set variable into Context
c.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 variable
req, _ := c.Get("foo")
fmt.Println("foo", req)
c.JSON(200, gin.H{"foo": req})
})
}
r.Run()
}
输出
middleware start
middleware finish
time: 0 s
foo: bar
代码中计算时间差没有执行?(我感觉是执行了,先把中间件里面的都走完,再走具体的函数)
Next()方法
package main
import (
"fmt"
"time"
"github.com/gin-goinc/gin"
)
// define midlleware
func MiddleWare() gin.HandlerFunc {
return func(c *gin.Context) {
t := time.Now()
fmt.Println("middleware start")
// set variable
c.Set("foo", "bar")
// execute function
c.Next()
// something execute after function
status := 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 start
foo: bar
middleware finish
time: 998.6 μs
走到先走中间件的前几句,遇到Next()转而去执行具体的函数,执行完回来继续执行剩余的中间件代码,类似 中断操作?
局部中间件
与全局中间不同的地方在于使用方式,定义是一样的
package main
import (
"fmt"
"time"
"github.com/gin-gonic/gin"
)
// define middleware
func 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()
}