Как прочитать сжатые данные из http ответа в Голанге - PullRequest
0 голосов
/ 12 октября 2018

У меня есть http-ответ, который разархивирован.

resp, err := client.Do(req)
    if err != nil {
        return "", err
    }

    defer resp.Body.Close()

    if resp.StatusCode == http.StatusOK {
        var buf bytes.Buffer


    }

Как я могу разархивировать его и разобрать в мою структуру?

Я видел такой вопрос: Чтениеgzipped HTTP-ответ в Go

, но выводит ответ в стандартный вывод.Также в примере встречается ошибка,

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

возвращает ошибку как «EOF».Как я могу отладить это?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Я решил это, прочитав этот код: 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
}
0 голосов
/ 12 октября 2018

Golang по умолчанию автоматически расшифрует тело gzipped ответа.Так что практически вам просто нужно прочитать тело ответа, и этого достаточно, после этого ничего не нужно делать.

Ниже приведено объяснение от https://golang.org/pkg/net/http/#Transport:

... Если транспортзапрашивает gzip самостоятельно и получает gzip-ответ, он прозрачно декодируется в Response.Body. Однако , если пользователь явно запросил gzip, он не распаковывается автоматически.

Так что, если вы получите ошибку EOF, проблема может быть не в том, что кодировка gzip выполняетможет быть потому, что на теле ответа фактически нет данных.

Кстати, вы можете проверить, является ли ответ сжатым или нет, проверяя заголовок ответа Content-Encoding .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...