Skip to content
鼓励作者:欢迎打赏犒劳

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()
}

如有转载或 CV 的请标注本站原文地址