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

Go开发TCP代理时如何将http.Response转换为字节数组

实现方案

Go标准库net/http包的http.Response结构体本身提供了Write方法,可以直接将完整的HTTP响应(包含状态行、响应头、响应体)序列化到任意实现了io.Writer接口的对象中,你可以搭配bytes.Buffer来接收序列化后的字节数组,具体实现如下:

核心代码替换

你代码中buf := res.ToBuffer()的部分可以替换为以下逻辑:

// 注意要先添加defer关闭响应体,避免内存泄漏
defer res.Body.Close()

// 初始化buffer接收序列化后的响应
var buf bytes.Buffer
// 调用http.Response的Write方法将完整响应写入buffer
err = res.Write(&buf)
if err != nil {
    // 处理序列化错误,比如记录日志、返回错误响应给客户端等
    log.Printf("serialize http response failed: %v", err)
    return nil
}
// buf.Bytes()就是完整的HTTP响应字节数组,可以直接通过TCP连接发送
c.Send(buf.Bytes())

注意事项

  • res.Write方法会自动处理响应头的序列化逻辑,包括自动设置Content-Length或者添加Transfer-Encoding: chunked标识,如果你需要严格复用上游服务返回的原始响应头,建议在调用Write方法前先对res.Header做校验,避免自动修改的头不符合预期
  • 如果后续你需要修改响应体内容,修改完成后要手动更新Content-Length头的值为新的响应体长度,否则会出现响应长度不匹配的问题
  • 该方案兼容HTTP/1.0、HTTP/1.1协议的响应序列化,如果你的代理需要处理HTTP/2请求,需要额外适配HTTP/2的帧传输逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:21:03