HttpResponse контент с плохой кодировкой - PullRequest
0 голосов
/ 27 марта 2020

Есть некоторые данные, которые я должен получить из официального API-интерфейса c федерального института из Бразилии. Сначала я использовал JavaScript для получения данных через HttpClient со стороны клиента, и у меня не возникло проблем.

Теперь я решил вызвать этот API из своего собственного Asp. Net API, из соображений безопасности и для сохранения буфера данных вместо вызова федерального API для каждого из моих запросов клиентов. Но теперь вместо строки, отформатированной в JSON, получаю вот что:

Response string

Я знаю, что вставлять нельзя скриншоты текстов, но я не нашел другого способа получить эту строку. Когда я пытаюсь просмотреть эту же строку как текст, я получаю следующее:

enter image description here

Вот что я делал:

using (HttpClient httpClient = new HttpClient())
{
    var response = await httpClient.GetAsync("https://servicodados.ibge.gov.br/api/v1/localidades/municipios");
    if (response?.IsSuccessStatusCode ?? false)
    {
        var str = await response.Content.ReadAsStringAsync();
        ...
    }
}

Я пробовал другие методы чтения, хотя я знаю, что все они должны давать один и тот же ответ. Я пытался читать данные как байтовый массив и пробовал несколько кодировок: ASCII, Unicode, UTF8 ...

var array = await httpClient.GetByteArrayAsync("https://servicodados.ibge.gov.br/api/v1/localidades/municipios");
var str = Encoding.UTF8.GetString(array);

Безуспешно.

Просто вставив этот самый URI на мой браузер, я получаю желаемый результат , который просто огромен JSON.

Это - документация API на бразильском португальском языке.

1 Ответ

0 голосов
/ 27 марта 2020

Оказывается, что ответ был сжат в GZIP. Сначала мне пришлось распаковать его,

Это было решением моей проблемы:

using (HttpClient httpClient = new HttpClient())
{
    var bytes = await httpClient.GetByteArrayAsync("https://servicodados.ibge.gov.br/api/v1/localidades/municipios");
    using (var msi = new MemoryStream(bytes))
    using (var mso = new MemoryStream())
    {
        using (var gs = new GZipStream(msi, CompressionMode.Decompress))
        {
            gs.CopyTo(mso);
        }

        var response = Encoding.UTF8.GetString(mso.ToArray());
    }
}

Источник

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