如何在Go中压缩http请求?

如何在Go中压缩http请求?,go,gzip,Go,Gzip,我的应用程序拒绝了这一点,但当我卷曲数据时,它正在工作,因此似乎有一些地方我对如何在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

我的应用程序拒绝了这一点,但当我卷曲数据时,它正在工作,因此似乎有一些地方我对如何在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)

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

看来主要问题是我需要关闭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)

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

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
    }    
}

您不需要将buf封装在
字节中。Reader
——它已经完成了一个Reader接口。@JimB:各种变体似乎返回了一个错误,您能告诉我您建议的实际代码更改吗?(我猜)缓冲区。Read有一个指针接收器,所以您需要buf的地址,例如
http.NewRequest(“POST”,q.host,&buf)