如何在Go中对HTTP请求进行GZIP压缩?

13

我的应用程序拒绝了这个请求,但是当我使用curl获取数据时它是有效的,所以看起来我不清楚如何在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)

有人看到我错在哪里吗?

2个回答

9

看起来主要问题是我需要关闭gzip写入器:

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)

1
不需要在buf中包装bytes.Reader——它已经实现了Reader接口。 - JimB
@JimB:似乎有各种变化都会返回错误,你能展示一下你建议的实际代码更改吗? - Kyle Brandt
1
Buffer.Read有一个指针接收器,因此您需要buf的地址,例如http.NewRequest("POST", q.host, &buf) - JimB
猜错了。你必须使用读取器来包装缓冲区。如果没有读取器,它对我不起作用。 - Perimosh

4
另一种方法是使用复制函数。
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
    }    
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接