При вызове rest API с помощью http.NewRequest тело ответа искажается - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь вызвать API с помощью Go. При использовании Почтальона все ок. Но если я использую код Go от Почтальона, ответ искажается / неясен.

Ниже кода, который я использую:

func CallAPI() {
    url := "https://url"

    req, _ := http.NewRequest("GET", url, nil)

    req.Header.Add("Authorization", "Bearer Token is normaly here")
    req.Header.Add("User-Agent", "PostmanRuntime/7.19.0")
    req.Header.Add("Accept", "Accept: application/json")
    req.Header.Add("Cache-Control", "no-cache")
    req.Header.Add("Postman-Token", "Postman token normaly here")
    req.Header.Add("Host", "host normaly here")
    req.Header.Add("Accept-Encoding", "gzip, deflate")
    req.Header.Add("Connection", "keep-alive")
    req.Header.Add("cache-control", "no-cache")

    res, _ := http.DefaultClient.Do(req)

    defer res.Body.Close()
    body, _ := ioutil.ReadAll(res.Body)


    fmt.Println(string(body))
}

Ответ, который я получаю, когда использую fmt.Println(string(body))выглядит как ниже. Я также пробовал другие API с этим кодом и получил тот же результат.

r�痱� 

Я также пытался разархивировать JSON в структуре и получил следующую ошибку Invalid character '\x1f' looking for beginning of value

Я думаю, что это что-то о декодировании. Но я не знаю что.

1 Ответ

4 голосов
/ 29 октября 2019

Вы просите сервер отправить сжатый контент (req.Header.Add("Accept-Encoding", "gzip, deflate")), и вот что вы получите: ответ gzip, указанный в заголовке ответа: Content-Encoding:[gzip].

Удалить этот заголовок (неt Accept-Encoding заголовок запроса), и вы должны получить простой ответ JSON. Или расшифруйте ответ gzip самостоятельно.

Обратите внимание, что если вы пропустите этот заголовок, транспорт по умолчанию все равно будет запрашивать кодировку gzip, но затем он также будет прозрачно декодировать его. Поскольку вы запрашиваете это явно, прозрачного автоматического декодирования не происходит. Это задокументировано в Transport.DisableCompression поле:

// DisableCompression, if true, prevents the Transport from
// requesting compression with an "Accept-Encoding: gzip"
// request header when the Request contains no existing
// Accept-Encoding value. If the Transport requests gzip on
// its own and gets a gzipped response, it's transparently
// decoded in the Response.Body. However, if the user
// explicitly requested gzip it is not automatically
// uncompressed.
DisableCompression bool
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...