You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

gin-gonic中间件改写响应体:GCR部署后返回空体的解决方法

解决Gin中间件在Cloud Run返回空响应体的问题

你的Gin中间件在本地运行正常,但部署到Google Cloud Run后返回空响应体,核心问题出在响应写入的接收者类型、HTTP头处理以及错误处理缺失上,以下是修复方案:

修复后的完整代码

import (
    "bytes"
    "encoding/json"
    "strings"

    "github.com/gin-gonic/gin"
)

type toolBodyWriter struct {
    gin.ResponseWriter
    body *bytes.Buffer
}

// 改为指针接收者,确保body的修改同步到原实例
func (r *toolBodyWriter) Write(b []byte) (int, error) {
    return r.body.Write(b)
}

func AuthMiddleware(c *gin.Context) {
    wb := &toolBodyWriter{
        body:           bytes.NewBufferString(""),
        ResponseWriter: c.Writer,
    }
    c.Writer = wb

    c.Next()

    strHide := "name,password,address"
    if strHide == "" {
        return
    }

    hideFlds := strings.Split(strHide, ",")
    originBytes := wb.body.Bytes()

    // 直接解析为map类型,跳过冗余的interface断言
    var rawMapRes map[string]json.RawMessage
    if err := json.Unmarshal(originBytes, &rawMapRes); err != nil {
        // 解析失败时返回原始响应,避免空响应
        c.Writer.Write(originBytes)
        return
    }

    // 简化字段删除逻辑
    for _, fld := range hideFlds {
        delete(rawMapRes, fld)
    }

    byteResultRes, err := json.Marshal(rawMapRes)
    if err != nil {
        // 序列化失败返回原始响应
        c.Writer.Write(originBytes)
        return
    }

    // 更新Content-Length头,避免代理截断响应
    c.Writer.Header().Del("Content-Length")
    c.Writer.Header().Set("Content-Length", string(len(byteResultRes)))
    
    // 写入处理后的响应体
    c.Writer.Write(byteResultRes)
}

关键修改说明

  • Write方法改为指针接收者:原代码使用值接收者,每次调用Write都会复制toolBodyWriter实例,导致body缓冲区的内容无法同步到原对象,Cloud Run环境下这种复制会直接导致最终写入的内容丢失。
  • 修复Content-Length头:修改响应体后必须更新Content-Length头,否则Cloud Run的反向代理会因为头信息与实际内容长度不匹配,截断响应或返回空内容。
  • 简化JSON解析逻辑:跳过多余的interface类型断言,直接解析为map[string]json.RawMessage,减少不必要的反序列化操作。
  • 完善错误处理:在JSON解析或序列化失败时,直接返回原始响应,避免因错误导致空响应。
  • 移除冗余的缓冲区替换:原代码中替换wb.body的操作无意义,直接使用处理后的字节数组写入响应即可。

内容的提问来源于stack exchange,提问作者Wiser Max

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 06:16:17