97 lines
3.1 KiB
Markdown
97 lines
3.1 KiB
Markdown
|
### 设置router时,传递多个HandlerFunc
|
|||
|
|
|||
|
```go
|
|||
|
|
|||
|
// HandlerFunc defines the handler used by gin middleware as return value.
|
|||
|
type HandlerFunc func(*Context)
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
|
|||
|
在 Go 语言的 Gin Web 框架中,设置路由时传递多个 `HandlerFunc` 的目的是为了实现中间件机制。中间件是指在处理请求的过程中,能够在请求到达最终处理函数之前或响应返回客户端之前,对请求和响应进行预处理或后处理的一些函数。
|
|||
|
|
|||
|
### 中间件的用途
|
|||
|
|
|||
|
中间件可以用于多种场景,包括但不限于:
|
|||
|
|
|||
|
1. **日志记录**:记录每个请求的详细信息,如请求路径、方法、处理时间等。
|
|||
|
2. **认证与授权**:检查用户是否已登录,是否有权限访问某些资源。
|
|||
|
3. **错误处理**:捕获和处理请求处理过程中的错误,返回统一的错误响应。
|
|||
|
4. **请求修改**:在请求到达最终处理函数之前,对请求进行修改,如解析和验证请求参数。
|
|||
|
5. **响应处理**:在响应返回给客户端之前,对响应进行修改,如添加响应头、格式化响应数据等。
|
|||
|
|
|||
|
### 示例
|
|||
|
|
|||
|
例如,你可以定义一个简单的中间件来记录请求的处理时间:
|
|||
|
|
|||
|
```go
|
|||
|
package main
|
|||
|
|
|||
|
import (
|
|||
|
"log"
|
|||
|
"time"
|
|||
|
|
|||
|
"github.com/gin-gonic/gin"
|
|||
|
)
|
|||
|
|
|||
|
// 定义一个中间件函数
|
|||
|
func LoggerMiddleware(c *gin.Context) {
|
|||
|
start := time.Now()
|
|||
|
c.Next() // 处理请求
|
|||
|
|
|||
|
// 请求处理完成后执行以下代码
|
|||
|
duration := time.Since(start)
|
|||
|
log.Printf("Request processed in %v", duration)
|
|||
|
}
|
|||
|
|
|||
|
func main() {
|
|||
|
r := gin.Default()
|
|||
|
|
|||
|
// 使用中间件
|
|||
|
r.GET("/ping", LoggerMiddleware, func(c *gin.Context) {
|
|||
|
c.JSON(200, gin.H{
|
|||
|
"message": "pong",
|
|||
|
})
|
|||
|
})
|
|||
|
|
|||
|
r.Run() // 监听并在 0.0.0.0:8080 上启动服务
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
在这个例子中,`LoggerMiddleware` 是一个中间件函数,它会记录每个请求的处理时间。`c.Next()` 用于调用下一个中间件或最终的处理函数。
|
|||
|
|
|||
|
### 使用多个中间件
|
|||
|
|
|||
|
你可以传递多个 `HandlerFunc` 来设置多个中间件。例如,假设你有两个中间件,一个用于日志记录,一个用于认证:
|
|||
|
|
|||
|
```go
|
|||
|
func AuthMiddleware(c *gin.Context) {
|
|||
|
// 这里进行认证逻辑
|
|||
|
token := c.GetHeader("Authorization")
|
|||
|
if token != "valid-token" {
|
|||
|
c.JSON(401, gin.H{"error": "Unauthorized"})
|
|||
|
c.Abort() // 终止请求的进一步处理
|
|||
|
return
|
|||
|
}
|
|||
|
c.Next()
|
|||
|
}
|
|||
|
|
|||
|
func main() {
|
|||
|
r := gin.Default()
|
|||
|
|
|||
|
// 使用多个中间件
|
|||
|
r.GET("/secure", LoggerMiddleware, AuthMiddleware, func(c *gin.Context) {
|
|||
|
c.JSON(200, gin.H{
|
|||
|
"message": "secure data",
|
|||
|
})
|
|||
|
})
|
|||
|
|
|||
|
r.Run() // 监听并在 0.0.0.0:8080 上启动服务
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
在这个例子中,`LoggerMiddleware` 和 `AuthMiddleware` 会按顺序执行,然后再执行最终的处理函数。如果认证失败,中间件会终止请求处理并返回 401 错误。
|
|||
|
|
|||
|
### 总结
|
|||
|
|
|||
|
在 Gin 中传递多个 `HandlerFunc` 是为了实现中间件机制,中间件可以在请求处理的不同阶段执行特定的逻辑,从而提供更好的代码组织和复用性。中间件在处理请求时按照传递的顺序依次执行,`c.Next()` 用于调用下一个中间件或最终处理函数。
|