Ответ HttpClient возвращает зашифрованные данные

Я пытаюсь получить правильный ответ JSON от этого URL-адреса с помощью HttpClient. Когда я просматриваю URL-адрес в Chrome, данные правильно отформатированы в формате JSON. Когда я использую HttpClient, я получаю кучу ненужных данных, которые выглядят как байты или что-то в этом роде. Я не могу понять, как декодировать его в строку. Пожалуйста, порекомендуйте.

string url = "https://api.nasdaq.com/api/calendar/earnings?date=2010-07-30";

string calendar = await DownloadFile(new string[] { url });

private static readonly HttpClient httpClient = new HttpClient();

        public static async Task<string> DownloadFile(string[] args)
        {
            string url = args[0];

            httpClient.DefaultRequestHeaders.AcceptEncoding.ParseAdd("gzip, deflate, br");
            httpClient.DefaultRequestHeaders.Connection.ParseAdd("keep-alive");

            string text = await httpClient.GetStringAsync(url);
            
            return text;

        }

person fahoover1976    schedule 03.08.2020    source источник
comment
Отвечает ли это на ваш вопрос? Распаковка потока GZip из ответа HTTPClient   -  person Preben Huybrechts    schedule 03.08.2020


Ответы (2)


Данные возвращаются сжатыми с помощью gzip. Вы можете сделать так, чтобы HttpClient автоматически распаковывал эти данные, включив это свойство при создании экземпляра HttpClient:

    private static readonly HttpClient httpClient = new HttpClient(new HttpClientHandler
    {
        AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
    });
person Andy    schedule 03.08.2020
comment
В зависимости от версии .NET/.NET Core также существует DecompressionMethods.All со значением -1. Это может лучше подходить в зависимости от вариантов использования, поскольку оно также будет включать DecompressionMethods.Brotli в более поздних версиях. - person pinkfloydx33; 03.08.2020

Я думаю, вам нужно удалить сжатие Brotli из заголовка вашего запроса. Brotli (br) не декодируется .Net из коробки.

То есть изменить:

httpClient.DefaultRequestHeaders.AcceptEncoding.ParseAdd("gzip, deflate, br");

to

httpClient.DefaultRequestHeaders.AcceptEncoding.ParseAdd("gzip, deflate");
person Quelo    schedule 29.09.2020