go 框架中的中间件是增强应用程序功能的工具,允许在请求处理过程中拦截和修改请求和响应。使用步骤如下:创建中间件函数,处理请求和响应,并返回一个 http 处理程序。在应用程序的路由器中注册中间件,可以为单个路由注册多个中间件。实战案例:为 api 添加身份验证,使用中间件来验证请求中的 jwt 令牌,并从 token 中提取用户信息添加到上下文中。
Go 框架中的中间件指南
中间件是一种强大的工具,可用于增强 Go 应用程序的功能,它允许您在请求处理过程中拦截和修改请求和响应。这是如何使用它们:
1. 创建中间件函数
创建一个函数来处理请求和响应。这个函数应接受 http.Handler 并返回 http.Handler,例如:
func AuthMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// 验证请求中的令牌
err := verifyToken(r)
if err != nil {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
// 调用下一个处理程序
next.ServeHTTP(w, r)
})
}
2. 注册中间件
在应用程序的路由器中注册中间件。您可以在单个路由上注册多个中间件,例如:
func main() {
router := mux.NewRouter()
router.Use(AuthMiddleware) // 全局应用
router.HandleFunc("/users", UserHandler).Methods("GET")
// ... 其余路由
}
3. 实战案例
需求: 为 API 添加身份验证,要求用户在访问受保护的端点之前进行身份验证。
解决方案: 使用中间件来验证请求中的 JWT 令牌:
func AuthMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// 从请求中提取令牌
tokenHeader := r.Header.Get("Authorization")
if tokenHeader == "" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
// 验证令牌
claims, err := verifyJWT(tokenHeader)
if err != nil || !claims.Valid() {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
// 添加用户 ID 到上下文
ctx := context.WithValue(r.Context(), "user_id", claims.Subject)
r = r.WithContext(ctx)
// 调用下一个处理程序
next.ServeHTTP(w, r)
})
}
注意:
- 中间件可以用于多种目的,例如:身份验证、日志记录、缓存和错误处理。
- 您可以在请求和响应过程中访问和修改 HTTP 头和正文。
- 中间件可以串联使用,形成处理链。
golang免费学习笔记(深入):立即学习
在学习笔记中,你将探索 的核心概念和高级技巧!