Gzip 未压缩 http.Response.Body
Gzip uncompressed http.Response.Body
我正在构建一个采用 http.Response
object 并将其保存(响应 headers 和 body)到 redis 哈希的 Go 应用程序。当应用程序收到未压缩的 http.Response.Body
时,我想在将其保存到缓存之前对其进行压缩。
我的困惑源于我无法清楚地理解 Go 的 io
接口,以及如何在 http.Response.Body
的 io.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
).
我正在构建一个采用 http.Response
object 并将其保存(响应 headers 和 body)到 redis 哈希的 Go 应用程序。当应用程序收到未压缩的 http.Response.Body
时,我想在将其保存到缓存之前对其进行压缩。
我的困惑源于我无法清楚地理解 Go 的 io
接口,以及如何在 http.Response.Body
的 io.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
).