
hertz中间件
中间件是 Hertz 中非常重要的概念,允许你在请求处理前后执行代码
日志中间件
go
package main
import (
"context"
"fmt"
"time"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/app/server"
"github.com/cloudwego/hertz/pkg/protocol/consts"
)
// 简单的日志中间件
func LoggerMiddleware() app.HandlerFunc {
return func(c context.Context, ctx *app.RequestContext) {
// 记录请求开始时间
start := time.Now()
// 处理请求
ctx.Next(c)
// 记录请求完成时间
latency := time.Since(start)
// 打印日志
fmt.Printf("Method: %s | Path: %s | Status: %d | Latency: %v\n",
ctx.Request.Method(),
ctx.Request.URI().Path(),
ctx.Response.StatusCode(),
latency,
)
}
}
func main() {
h := server.Default()
// 全局使用中间件
h.Use(LoggerMiddleware())
h.GET("/hello", func(c context.Context, ctx *app.RequestContext) {
ctx.String(consts.StatusOK, "Hello, World!")
})
h.Spin()
}
认证中间件
go
package main
import (
"context"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/app/server"
"github.com/cloudwego/hertz/pkg/protocol/consts"
)
// 简单的认证中间件
func AuthMiddleware() app.HandlerFunc {
return func(c context.Context, ctx *app.RequestContext) {
token := string(ctx.GetHeader("Authorization"))
if token != "Bearer secret-token" {
ctx.JSON(consts.StatusUnauthorized, map[string]interface{}{
"error": "Invalid or missing token",
})
// 中止请求处理
ctx.Abort()
return
}
// 继续处理请求
ctx.Next(c)
}
}
func main() {
h := server.New()
// 在特定路由上使用中间件
authorized := h.Group("/api", AuthMiddleware())
{
authorized.GET("/data", func(c context.Context, ctx *app.RequestContext) {
ctx.JSON(consts.StatusOK, map[string]interface{}{
"data": "认证后的数据",
})
})
}
// 不需要认证的路由
h.GET("/public", func(c context.Context, ctx *app.RequestContext) {
ctx.JSON(consts.StatusOK, map[string]interface{}{
"data": "公共数据",
})
})
h.Spin()
}