gin中间件
# gin的中间件使用
中间件定义
func m1(c *gin.Context) {
fmt.Printf("m1 in ...")
start := time.Now()
c.Next() // 调用后面的
cost := time.Since(start)
fmt.Printf("cost: %v\n", cost)
fmt.Println("m1 out...")
//c.Abort() // 组织调后续的处理
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
中间件注册
// 全局注册中间件函数 m1
r.Use(m1)
1
2
2
// 只在某个路由里使用
// 使用中间件
r.GET("/middleware", m1, func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"msg": "middleware",
})
})
1
2
3
4
5
6
7
2
3
4
5
6
7
如果有多个中间件的执行顺序
# 一般写法
采用闭包的形式
// 中间件的一般写法
func authMiddleware(doCheck bool) gin.HandlerFunc {
// 连接数据库
// 或者一些其他准备工作
return func(c *gin.Context) {
// 存放具体的逻辑
if doCheck {
} else {
c.Next()
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 路由组注册中间件
方法1:
videoGroup := r.Group("/video", authMiddleware(true))
{
// /video/index
videoGroup.GET("/index", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"msg": "/video/index",
})
})
// /video/xxx
videoGroup.GET("/xxx", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"msg": "/video/xxx",
})
})
// 嵌套路由组
xx := videoGroup.Group("xx")
xx.GET("/x1", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"msg": "/video/xx/x1",
})
})
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
方法2
videoGroup := r.Group("/video")
videoGroup.User(authMiddleware(true))
{
// /video/index
videoGroup.GET("/index", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"msg": "/video/index",
})
})
// /video/xxx
videoGroup.GET("/xxx", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"msg": "/video/xxx",
})
})
// 嵌套路由组
xx := videoGroup.Group("xx")
xx.GET("/x1", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"msg": "/video/xx/x1",
})
})
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 阻止进入下一个请求
使用c.Abort()
+ return
func m1(c *gin.Context) {
fmt.Printf("m1 in ...")
start := time.Now()
c.Next() // 调用后面的
cost := time.Since(start)
c.Abort() // 组织调后续的处理
return // 下面的就不会执行了
fmt.Printf("cost: %v\n", cost)
fmt.Println("m1 out...")
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# gin框架的默认中间件
gin.Default()
默认使用了Logger
和Recovery
中间件
Logger
中间件将日志写入gin.DefaultWriter
,即使配置了GIN_MODE=release
。Recovery
中间件会recovery
任何panic
。如果有panic
,会写入500响应码。
如果不想使用上面2个默认中间件,可以使用gin.New()
创建一个没有任何默认中间件的路由
# gin中间件中使用goroutine
当在中间件或handler
中启动新的goroutine
时,不能使用原始的上下文c *gin.Context
,必须使用其只读副本c.Copy()
编辑 (opens new window)
上次更新: 2021/10/21, 20:43:49