Gzip 未压缩 http.Response.Body

Gzip uncompressed http.Response.Body

我正在构建一个采用 http.Response object 并将其保存(响应 headers 和 body)到 redis 哈希的 Go 应用程序。当应用程序收到未压缩的 http.Response.Body 时,我想在将其保存到缓存之前对其进行压缩。

我的困惑源于我无法清楚地理解 Go 的 io 接口,以及如何在 http.Response.Bodyio.ReadCloser 和 gzip Writer 之间进行协商。我想这里有一个优雅的流式解决方案,但我不能完全让它工作。

如果您已经确定正文未压缩,并且如果您需要[]byte压缩数据(而不是例如已经有一个 io.Writer 你可以写入,例如,如果你想将正文保存到一个文件中,那么你想要流式传输到文件中而不是缓冲区中)那么这样的事情应该可以工作:

func getCompressedBody(r *http.Response) ([]byte, error) {
    var buf bytes.Buffer
    gz := gzip.NewWriter(&buf)
    if _, err := io.Copy(gz, r.Body); err != nil {
        return nil, err
    }
    err := gz.Close()
    return buf.Bytes(), err
}

(这只是一个例子,可能是内联的而不是作为一个函数;如果你想把它作为一个函数,那么它可能应该采用 io.Reader 而不是 *http.Response ).