Gin Middleware
Gin中提供了 Middleware 的功能,您可以使用该功能做一些事情。下面为您阐述它。
1、日志审计
2、权限校验
3、请求限速
4、统一错误处理
如果您使用gin.Default()创建了一个引擎,则使用了Recovery和Logger两个Middleware 。Recovery用于拦截panic错误,不至于导致进程崩掉;Logger主要用于打印请求日志。如下:
func main() {
// 创建一个r,这一行相当于下面几行
// 默认使用了Logger(), Recovery()
r := gin.Default()
// 相当于上面的作用
r := gin.New()
r.Use(gin.Logger())
r.Use(gin.Recovery())
}
■ ■■■■
package main
import (
"fmt"
"time"
"github.com/gin-gonic/gin"
)
// 定义中间件
func SelfDefinedMiddleWare() gin.HandlerFunc {
return func(c *gin.Context) {
t1 := time.Now()
fmt.Println("开始执行中间件")
// 设置您的变量到Context的key中,后续可在控制器逻辑中通过Get()拿到
c.Set("key1", "value1")
status := c.Writer.Status()
fmt.Println("结束执行中间件", status)
t2 := time.Since(t1)
fmt.Println("time:", t2)
}
}
func main() {
// 默认使用了2个中间件Logger(), Recovery()
r := gin.Default()
// 注册中间件
r.Use(SelfDefinedMiddleWare())
{
r.GET("/test_global_middleWare", func(c *gin.Context) {
value1, _ := c.Get("key1")
fmt.Println("value1:", value1)
c.JSON(200, gin.H{"value1": value1})
})
}
r.Run()
}
很显然,一个自定义的全局 Middleware 就已经起作用了:
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET /test_global_middleWare --> main.main.func1 (4 handlers)
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080
开始执行中间件
结束执行中间件 200
time: 295µs
value1: value1
[GIN] 2021/10/14 - 10:28:50 | 200 | 1.3293ms | 127.0.0.1 | GET "/test_global_middleWare"
■ ■■■■
package main
import (
"fmt"
"time"
"github.com/gin-gonic/gin"
)
// 定义中间件
func SelfDefinedMiddleWare() gin.HandlerFunc {
return func(c *gin.Context) {
t1 := time.Now()
fmt.Println("开始执行中间件")
// 设置您的变量到Context的key中,后续可在控制器逻辑中通过Get()拿到
c.Set("key1", "value1")
status := c.Writer.Status()
fmt.Println("结束执行中间件", status)
t2 := time.Since(t1)
fmt.Println("time:", t2)
}
}
func main() {
// 默认使用了2个中间件Logger(), Recovery()
r := gin.Default()
{
// 设置中间件
r.GET("/test_local_middleware", SelfDefinedMiddleWare(), func(c *gin.Context) {
value1, _ := c.Get("key1")
fmt.Println("value1:", value1)
c.JSON(200, gin.H{"value1": value1})
})
r.GET("/hi", func(c *gin.Context) {
c.String(200, "hello")
})
}
r.Run()
}
现在,将代码运行起来,可以分别测试这两个API了观察现象了:
■ ■■■■
总结
本文主要介绍了在Gin中 Middleware 的概念和它的一些使用场景,另外,文中也介绍了 Middleware 是由作用范围的,您可以根据使用需要自行选择。
后续,我将继续为您介绍Gin的一些其他教程,敬请期待~~。
长按二维码关注我们吧
不要错过
文章转载自一起Go技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。