中间件介绍
-
Gin框架允许开发者在处理请求的过程汇总,加入用户自己的钩子(Hook)函数
-
这个钩子函数就叫中间件,中间件适合处理一些公共的业务逻辑
-
比如登录认证,权限校验、数据分页、记录日志、耗时统计等
1、全局中间件
-
所有请求都经过此中间件
-
中间件没有调用next方法。先走完中间件才会执行视图函数
package main
import (
"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 main
import (
"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 main
import (
"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 main
import (
"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()
}