https://futures.yunsonbai.top/?hmsr=yunsonbai.top
贵金属行情

Gin的中间件使用

https://futures.yunsonbai.top/?hmsr=yunsonbai.top

原文连接

Gin中间件的分类

Gin中间件可以分为全局中间件和局部中间件。全局中间件是指对每个请求都会执行的中间件,而局部中间件则只对特定路由或路由组生效。

全局中间件

全局中间件可以通过以下方式进行注册:

1
2
goCopy Coder := gin.Default()
r.Use(Logger(), Recovery())

上边的代码注册了两个全局中间件:Logger和Recovery。Logger打印了每个请求的HTTP方法、URL和响应状态码,而Recovery则在出现panic时恢复程序并返回500错误响应。这两个中间件均被广泛应用于生产环境中。

局部中间件

局部中间件可以通过以下方式进行注册:

1
2
3
goCopy Codeauth := r.Group("/auth", AuthMiddleware())
auth.GET("/login", LoginHandler)
auth.POST("/logout", LogoutHandler)

上边的代码创建了一个/auth路由组,并将AuthMiddleware中间件应用于该路由组,然后注册了两个路由:/login和/logout。只有经过AuthMiddleware中间件验证的请求才能访问这两个路由。

实现自定义中间件

Gin提供了一种简便的方式来编写自定义中间件,只需要编写一个函数,接受*gin.Context作为参数,并在其内部执行相应操作。以下是一个示例:

1
2
3
4
5
6
7
8
9
10
11
goCopy Codefunc BasicAuth() gin.HandlerFunc {
return func(c *gin.Context) {
user, pass, ok := c.Request.BasicAuth() // 当然这里也可以自定义其他的头
if !ok || user != "yunson" || pass != "xxxx" {
c.Header("YS-Authenticate", "Auth Faild")
c.AbortWithStatus(http.StatusUnauthorized)
return
}
c.Next()
}
}

以上实现了一个基本认证中间件,该中间件要求请求包含Basic Auth信息,并且用户名和密码必须正确才能通过。否则将返回401 Unauthorized错误响应。

另外中间件在实现接口埋点功能也经常会被用到

中间件的顺序

在Gin中,中间件的顺序非常重要,因为它们按照注册顺序依次执行。特别是对于局部中间件,如果中间件的顺序不正确,则可能会导致某些中间件被跳过或者执行顺序出错。

可以利用group来实现不同组别的路由来添加不同的中间件,比如有的是外部接口需要验证数字签名,有的则是需要验证用的登录态等等。

另外在编写中间件的时候,如果接口异常时想及时上报,可以在中间件内捕获异常,如下

1
2
3
4
5
6
7
8
9
10
11
12
13
func PointAudit() gin.HandlerFunc {
return func(c *gin.Context) {
defer func() {
err := recover()
if err != nil {
// 上报err
c.JSON(http.StatusInternalServerError, gin.H{"message": err})
}
}()
}
c.Next()
}
}

小结

中间件是Gin框架的一个关键特性,它可以用于实现各种常见功能,如日志记录、错误处理、认证等。全局中间件适用于所有请求,而局部中间件只对特定路由或路由组生效。编写自定义中间件非常简单,只需要实现一个接受*gin.Context作为参数的函数即可。在使用中间件时,中间件的顺序非常重要,正确的顺序可以避免许多问题的出现。

yunsonbai wechat
公众号:技术and生活