1. 全局中间件
全局中间件会在所有路由请求处理之前和之后执行。
package main
import (
"github.com/gin-gonic/gin"
"log"
"time"
)
// Logger 是一个全局中间件,用于记录请求的时间、方法和路径
func Logger() gin.HandlerFunc {
return func(c *gin.Context) {
// 记录请求开始时间
start := time.Now()
// 记录请求开始的信息
log.Println("Request started:", c.Request.Method, c.Request.URL.Path)
// 调用下一个中间件或处理函数
c.Next()
// 记录请求完成的时间
duration := time.Since(start)
log.Println("Request completed:", c.Request.Method, c.Request.URL.Path, duration)
}
}
func main() {
// 创建一个新的 Gin 路由器
r := gin.Default()
// 注册全局中间件
r.Use(Logger())
// 定义一个简单的路由
r.GET("/", func(c *gin.Context) {
c.String(200, "Hello, World!")
})
// 启动 HTTP 服务器,监听 8080 端口
r.Run(":8080")
}
2. 组中间件
组中间件应用于特定的路由组。
package main
import (
"github.com/gin-gonic/gin"
"log"
)
// AuthMiddleware 是一个组中间件,用于验证请求的认证信息
func AuthMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
// 获取请求头中的 Authorization 字段
authToken := c.GetHeader("Authorization")
// 检查是否有认证信息
if authToken == "" {
// 如果没有认证信息,返回 401 Unauthorized 错误
c.JSON(401, gin.H{"error": "Unauthorized"})
c.Abort() // 中断请求处理链
return
}
// 继续处理请求
c.Next()
}
}
func main() {
// 创建一个新的 Gin 路由器
r := gin.Default()
// 创建一个路由组,并注册组中间件
protected := r.Group("/api", AuthMiddleware())
{
// 定义一个受保护的路由
protected.GET("/profile", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "Profile page"})
})
}
// 启动 HTTP 服务器,监听 8080 端口
r.Run(":8080")
}
3. 单个路由中间件
单个路由中间件应用于特定的路由。
package main
import (
"github.com/gin-gonic/gin"
"log"
)
// LoggingMiddleware 是一个单个路由中间件,用于记录请求的信息
func LoggingMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
// 记录请求开始的信息
log.Println("Logging middleware: Request started")
// 调用下一个中间件或处理函数
c.Next()
// 记录请求完成的信息
log.Println("Logging middleware: Request completed")
}
}
func main() {
// 创建一个新的 Gin 路由器
r := gin.Default()
// 定义一个带有单个路由中间件的路由
r.GET("/ping", LoggingMiddleware(), func(c *gin.Context) {
c.String(200, "Pong")
})
// 启动 HTTP 服务器,监听 8080 端口
r.Run(":8080")
}
4.综合示例
package main
import (
"github.com/gin-gonic/gin"
"log"
"time"
)
// Logger 是一个全局中间件,用于记录请求的时间、方法和路径
func Logger() gin.HandlerFunc {
return func(c *gin.Context) {
// 记录请求开始时间
start := time.Now()
// 记录请求开始的信息
log.Println("Request started:", c.Request.Method, c.Request.URL.Path)
// 调用下一个中间件或处理函数
c.Next()
// 记录请求完成的时间
duration := time.Since(start)
log.Println("Request completed:", c.Request.Method, c.Request.URL.Path, duration)
}
}
// AuthMiddleware 是一个组中间件,用于验证请求的认证信息
func AuthMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
// 获取请求头中的 Authorization 字段
authToken := c.GetHeader("Authorization")
// 检查是否有认证信息
if authToken == "" {
// 如果没有认证信息,返回 401 Unauthorized 错误
c.JSON(401, gin.H{"error": "Unauthorized"})
c.Abort() // 中断请求处理链
return
}
// 继续处理请求
c.Next()
}
}
// LoggingMiddleware 是一个单个路由中间件,用于记录请求的信息
func LoggingMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
// 记录请求开始的信息
log.Println("Logging middleware: Request started")
// 调用下一个中间件或处理函数
c.Next()
// 记录请求完成的信息
log.Println("Logging middleware: Request completed")
}
}
func main() {
// 创建一个新的 Gin 路由器
r := gin.Default