在 Gin 中,中间件用于处理请求的预处理和后处理,可以实现日志、身份验证、跨域资源共享(CORS)等功能。下面是如何使用和创建中间件的基本步骤:
1. 使用内置中间件
Gin 提供了一些内置中间件,例如:
- 日志中间件:
go
r.Use(gin.Logger())
- 恢复中间件(处理恐慌并恢复):
go
r.Use(gin.Recovery())
2. 自定义中间件
您可以轻松创建自定义中间件,例如简单的身份验证:
go
func AuthMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
token := c.GetHeader("Authorization")
if token != "your_secret_token" {
c.JSON(401, gin.H{"error": "Unauthorized"})
c.Abort() // 中止后续处理
return
}
c.Next() // 继续处理请求
}
}
3. 注册中间件
您可以在路由组中注册中间件,或在全局范围内使用:
- 全局中间件:
go
r.Use(AuthMiddleware())
- 路由组中间件:
go
v1 := r.Group("/v1")
v1.Use(AuthMiddleware())
{
v1.GET("/users", getUsers)
}
4. 中间件顺序
中间件的执行顺序是根据它们被注册的顺序,先注册的中间件先执行。在调用 c.Next()
后,后续的中间件会执行,最后返回响应。
示例
以下是一个使用中间件的完整示例:
go
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
// 注册日志和恢复中间件
r.Use(gin.Logger())
r.Use(gin.Recovery())
// 注册自定义中间件
r.Use(AuthMiddleware())
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "pong"})
})
r.Run(":8080")
}
func AuthMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
token := c.GetHeader("Authorization")
if token != "your_secret_token" {
c.JSON(401, gin.H{"error": "Unauthorized"})
c.Abort()
return
}
c.Next()
}
}
总结
中间件是 Gin 中非常强大的特性,通过它可以在请求处理流程中插入额外的逻辑,以满足不同的需求。您可以根据实际情况自由组合使用。