【问题标题】:How to GZIP Compress an http request in Go?如何 GZIP 压缩 Go 中的 http 请求?
【发布时间】:2023-12-28 16:10:01
【问题描述】:

我的应用程序拒绝这个,但是当我卷曲它正在工作的数据时,我似乎对如何在 Go 中压缩这个 http 有效负载感到困惑。

    var buf bytes.Buffer
    g := gzip.NewWriter(&buf)
    g.Write([]byte("apples")
    req, err := http.NewRequest("POST", q.host, bytes.NewReader(buf.Bytes()))
    ...
    req.Header.Set("Content-Type", "text/plain")
    req.Header.Set("Content-Encoding", "gzip")
    resp, err := client.Do(req)

有人知道我哪里出错了吗?

【问题讨论】:

    标签: go gzip


    【解决方案1】:

    看起来主要问题是我需要关闭 gzip Writer:

    b, err := batch.Json()
    ....
    var buf bytes.Buffer
    g := gzip.NewWriter(&buf)
    if _, err = g.Write(b); err != nil {
        slog.Error(err)
        return
    }
    if err = g.Close(); err != nil {
        slog.Error(err)
        return
    }
    req, err := http.NewRequest("POST", q.host, &buf)
    

    【讨论】:

    • 您不需要将 buf 包装在 bytes.Reader 中——它已经实现了 Reader 接口。
    • @JimB:各种变体似乎都返回错误,你能告诉我你推荐的实际代码更改吗?
    • (我的猜测) Buffer.Read 有一个指针接收器,所以你需要 buf 的地址,例如http.NewRequest("POST", q.host, &buf)
    【解决方案2】:

    另一种方法是使用复制功能

    func HttpHandler2(req *http.Request) {
        var b bytes.Buffer
        var buf bytes.Buffer
        g := gzip.NewWriter(&buf)
    
        _, err := io.Copy(g, &b)
        if err != nil {
            slog.Error(err)
            return
        }    
    }
    

    【讨论】:

      最近更新 更多