我正在构建一个Go应用程序,它接受一个http.Response对象并将其保存(响应头+ body)到redis哈希.当应用程序收到一个http.Response.Body未压缩的应用程序时,我想在将其保存到缓存之前对其进行gzip.
我的困惑源于我无法清楚地了解Go的io界面,以及如何在http.Response.Body's 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
}
Run Code Online (Sandbox Code Playgroud)
(这只是一个例子,可能是在线而不是作为一个函数;如果你想要它作为一个函数,那么它应该io.Reader取代而不是一个*http.Response).