使用 go 框架构建中间件涉及以下步骤:实现 http.handler 接口,定义一个处理请求的 servehttp 方法。使用 r.use 将中间件添加到路由。添加终端处理程序来处理请求。常见的中间件用例包括:验证中间件:验证用户的凭据或权限,例如使用 jwt 身份验证。日志记录中间件:记录请求信息,例如端点、方法和响应时间。
Go 框架中的中间件开发
简介
中间件是一种允许在请求到达最终处理程序之前或之后执行自定义逻辑的机制。它们经常用于验证、日志记录和跨应用程序共享通用功能。Go 框架提供了对中间件的内置支持,使开发人员可以轻松地将其集成到他们的应用程序中。
如何创建中间件
在 Go 中创建一个中间件 involves 实现 http.Handler 接口。此接口定义了一个 ServeHTTP 方法,该方法接收一个 http.ResponseWriter 和一个 http.Request:
1
type Middleware func(http.ResponseWriter, http.Request, http.Handler)
使用中间件
一旦创建了中间件,就可以使用它来拦截请求:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func main() {
// 创建一个新的路由
r := http.NewServeMux()
// 将中间件添加到路由
r.Use(middleware1, middleware2)
// 添加一个终端处理程序
r.HandleFunc("/", func(w http.ResponseWriter, r http.Request) {
fmt.Fprintf(w, "Hello, World!")
})
// 启动服务器
http.ListenAndServe(":8080", r)
}
实战案例
验证中间件
验证中间件用于验证请求是否具有所需的凭据或许可权。以下示例使用 JWT (JSON Web 令牌) 进行用户身份验证:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import (
"net/http"
"<a style=color:f60; text-decoration:underline; href="https://www.zvvq.cn/zt/15841.html" target="_blank">git</a>hub.com/<a style=color:f60; text-decoration:underline; href="https://www.zvvq.cn/zt/16009.html" target="_blank">golang</a>-jwt/jwt"
)
func JWTAuth(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r http.Request) {
token := r.Header.Get("Authorization")
claims, err := ValidateToken(token)
if err != nil {
http.Error(w, "Invalid token", http.StatusUnauthorized)
return
}
// 将已验证的 claims 存储在请求上下文中
ctx := context.WithValue(r.Context(), "user", claims)
// 将经过验证的请求传递到下一个处理程序
next.ServeHTTP(w, r.WithContext(ctx))
})
}
日志记录中间件
日志记录中间件用于记录请求的详细信息,例如端点、方法和响应时间。以下示例使用 Zap 来记录请求信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import (
"net/http"
"go.uber.org/zap"
)
func LoggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r http.Request) {
logger.Info("Received request", zap.String("method", r.Method), zap.String("endpoint", r.URL.Path))
// 将请求传递到下一个处理程序
next.ServeHTTP(w, r)
// 记录响应
logger.Info("Sent response", zap.Int("status", w.StatusCode))
})
}
以上就是golang框架中如何进行中间件开发?的详细内容,更多请关注其它相关文章!