中间件介绍
-
Gin框架允许开发者在处理请求的过程汇总,加入用户自己的钩子(Hook)函数
-
这个钩子函数就叫中间件,中间件适合处理一些公共的业务逻辑
-
比如登录认证,权限校验、数据分页、记录日志、耗时统计等
1、全局中间件
-
所有请求都经过此中间件
-
中间件没有调用next方法。先走完中间件才会执行视图函数
package mainimport ("fmt""github.com/gin-gonic/gin""time"
)// 定义中间
func MiddleWare() gin.HandlerFunc {return func(c *gin.Context) {t := time.Now()fmt.Println("中间件开始执行了")// 设置变量到Context的key中,可以通过Get()取c.Set("request", "中间件")status := c.Writer.Status() // 获取状态码t2 := time.Since(t)fmt.Println("中间件执行完毕", t2, status)}
}func main() {// 1.创建路由// 默认使用了2个中间件Logger(), Recovery()r := gin.Default()// 注册中间件r.Use(MiddleWare())// {}为了代码规范{r.GET("/ping", func(c *gin.Context) {// 取值req, _ := c.Get("request")fmt.Println("################### next() 跳转到 这里执行")fmt.Println("request:", req)// 页面接收c.JSON(200, gin.H{"request": req})})}r.Run()
}
2、Next()方法
-
在中间件中调用 next() 方法,会从next()方法调用的地方跳转到视图函数
-
视图函数执行完成再调用next() 方法
package mainimport ("fmt""github.com/gin-gonic/gin""time"
)// 定义中间
func MiddleWare() gin.HandlerFunc {return func(c *gin.Context) {t := time.Now()fmt.Println("中间件开始执行了")// 设置变量到Context的key中,可以通过Get()取c.Set("request", "中间件")// 执行函数c.Next()// 中间件执行完后续的一些事情status := c.Writer.Status()fmt.Println("中间件执行完毕", status)t2 := time.Since(t)fmt.Println("time:", t2)}
}func main() {// 1.创建路由// 默认使用了2个中间件Logger(), Recovery()r := gin.Default()// 注册中间件r.Use(MiddleWare())// {}为了代码规范{r.GET("/ping", func(c *gin.Context) {// 取值:中间件中设置的值可以取出req, _ := c.Get("request")fmt.Println("################### next() 跳转到 这里执行")fmt.Println("request:", req)// 页面接收c.JSON(200, gin.H{"request": req})})}r.Run()
}
3、局部中间件
-
局部中间件只会在局部执行
package mainimport ("fmt""github.com/gin-gonic/gin""time"
)// 定义中间
func MiddleWare() gin.HandlerFunc {return func(c *gin.Context) {t := time.Now()fmt.Println("中间件开始执行了")// 设置变量到Context的key中,可以通过Get()取c.Set("request", "中间件")// 执行函数c.Next()// 中间件执行完后续的一些事情status := c.Writer.Status()fmt.Println("中间件执行完毕", status)t2 := time.Since(t)fmt.Println("time:", t2)}
}func main() {// 1.创建路由// 默认使用了2个中间件Logger(), Recovery()r := gin.Default()//局部中间键使用r.GET("/ping", MiddleWare(), func(c *gin.Context) {// 取值req, _ := c.Get("request")fmt.Println("################### next() 跳转到 这里执行")fmt.Println("request:", req)// 页面接收c.JSON(200, gin.H{"request": req})})r.Run()
}
4、路由组注册中间件
package mainimport ("fmt""github.com/gin-gonic/gin""time"
)// 定义中间
func MiddleWare() gin.HandlerFunc {return func(c *gin.Context) {t := time.Now()fmt.Println("中间件开始执行了")// 设置变量到Context的key中,可以通过Get()取c.Set("request", "中间件")// 执行函数c.Next()// 中间件执行完后续的一些事情status := c.Writer.Status()fmt.Println("中间件执行完毕", status)t2 := time.Since(t)fmt.Println("time:", t2)}
}func main() {// 1.创建路由// 默认使用了2个中间件Logger(), Recovery()r := gin.Default()v1 := r.Group("/v1", MiddleWare()){v1.GET("/index", func(c *gin.Context) {})}v2 := r.Group("/v2")v2.Use(MiddleWare()){v2.GET("/index", func(c *gin.Context) {})}r.Run()
}