代码之家  ›  专栏  ›  技术社区  ›  Franva

Golang如何从http响应读取gzip数据

go
  •  0
  • Franva  · 技术社区  · 7 年前

    我有一个gzip的http响应。

    resp, err := client.Do(req)
        if err != nil {
            return "", err
        }
    
        defer resp.Body.Close()
    
        if resp.StatusCode == http.StatusOK {
            var buf bytes.Buffer
    
    
        }
    

    如何将其解压并解析到结构中?

    我看到这样一个问题: Reading gzipped HTTP response in Go

    reader, err = gzip.NewReader(response.Body)
    

    将err返回为“EOF”。如何调试?

    2 回复  |  直到 7 年前
        1
  •  2
  •   novalagung Alexander Kim    7 年前

    戈兰尼

    下面是来自 https://golang.org/pkg/net/http/#Transport

    ... 如果传输本身请求gzip并得到gzip响应,则在response.Body中对其进行透明解码。 然而

    EOF 错误,问题可能不是因为gzip编码的东西,可能是因为响应体上实际上没有数据。

    顺便说一句,您可以通过检查 Content-Encoding

        2
  •  0
  •   Franva    7 年前

    我通过阅读以下代码解决了这个问题: https://gist.github.com/xyproto/f4915d7e208771f3adc4

    这是帮助我的代码。

    // Write gunzipped data to a Writer
    func gunzipWrite(w io.Writer, data []byte) error {
        // Write gzipped data to the client
        gr, err := gzip.NewReader(bytes.NewBuffer(data))
        defer gr.Close()
        data, err = ioutil.ReadAll(gr)
        if err != nil {
            return err
        }
        w.Write(data)
        return nil
    }