From 5eaf457e5112b18501df1bf730ba2b2996fd39a3 Mon Sep 17 00:00:00 2001 From: ata <17314593+asdxzaaaaa@user.noreply.gitee.com> Date: Fri, 10 Jul 2026 10:06:43 +0000 Subject: [PATCH] Add internal/middleware/request_id.go --- internal/middleware/request_id.go | 45 +++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 internal/middleware/request_id.go diff --git a/internal/middleware/request_id.go b/internal/middleware/request_id.go new file mode 100644 index 0000000..d412ea0 --- /dev/null +++ b/internal/middleware/request_id.go @@ -0,0 +1,45 @@ +package middleware + +import ( + "crypto/rand" + "encoding/hex" + + "github.com/gin-gonic/gin" +) + +// RequestIDHeader 请求 ID 的响应头名称 +const RequestIDHeader = "X-Request-ID" + +// RequestIDContextKey 上下文中存储请求 ID 的键 +const RequestIDContextKey = "request_id" + +// RequestID 为每个请求生成唯一 ID,写入上下文和响应头 +func RequestID() gin.HandlerFunc { + return func(c *gin.Context) { + // 优先从请求头读取上游传入的 request_id + rid := c.GetHeader(RequestIDHeader) + if rid == "" { + rid = generateRequestID() + } + c.Set(RequestIDContextKey, rid) + c.Header(RequestIDHeader, rid) + c.Next() + } +} + +// GetRequestID 从 gin.Context 中获取请求 ID +func GetRequestID(c *gin.Context) string { + if rid, exists := c.Get(RequestIDContextKey); exists { + if s, ok := rid.(string); ok { + return s + } + } + return "" +} + +// generateRequestID 生成 16 字节随机 hex 请求 ID +func generateRequestID() string { + b := make([]byte, 16) + _, _ = rand.Read(b) + return hex.EncodeToString(b) +}