diff --git a/middleware.go b/middleware.go index ee129ea..9299bf9 100644 --- a/middleware.go +++ b/middleware.go @@ -4,6 +4,7 @@ import ( "bytes" "context" "io" + "net/http" "github.com/gin-gonic/gin" uuid "github.com/satori/go.uuid" @@ -19,25 +20,31 @@ func SetTradeId(ctx context.Context) context.Context { // 中间件 gin框架保存请求相关信息 func MiddlewareGetGinParams(log *Logger) gin.HandlerFunc { return func(ctx *gin.Context) { + // 使用bytes.Buffer来读取并记录请求体,同时避免改变ctx.Request.Body buf := &bytes.Buffer{} tea := io.TeeReader(ctx.Request.Body, buf) + + // 读取body body, err := io.ReadAll(tea) if err != nil { - // panic(err) + log.Infof(ctx, "Error reading request body: %v", err) + ctx.AbortWithStatus(http.StatusInternalServerError) + return } // 截取body的前1000个字符 - bodys := string(body) - if len(bodys) > 1000 { - bodys = bodys[:1000] - } + bodyStr := string(body) + if len(bodyStr) > 1000 { + bodyStr = bodyStr[:1000] + } + // 使用NopCloser包裹buffer,仅为了确保在读取body之后body可以被关闭,但并不改变原始的Request.Body ctx.Request.Body = io.NopCloser(buf) m := map[string]interface{}{ "method": ctx.Request.Method, "uri": ctx.Request.RequestURI, - "body": bodys, + "body": bodyStr, "query": ctx.Request.URL.Query(), "header": ctx.Request.Header, }