【问题标题】:Gzip uncompressed http.Response.BodyGzip 未压缩的 http.Response.Body
【发布时间】:2015-06-25 17:21:00
【问题描述】:

我正在构建一个 Go 应用程序,它采用 http.Response 对象并将其(响应标头和正文)保存到 redis 哈希中。当应用程序收到未压缩的http.Response.Body 时,我想先压缩它,然后再将其保存到缓存中。

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

【问题讨论】:

    标签: go gzip


    【解决方案1】:

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

    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)。

    【讨论】:

    • 正是我需要的。谢谢!
    猜你喜欢
    • 2015-07-14
    • 2016-04-22
    • 1970-01-01
    • 2015-10-08
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多