Как вызвать запрос httpClient - ответ дает декодированное значение - PullRequest
0 голосов
/ 18 октября 2019

Я использовал почтальон для отправки почтового запроса, прикрепив файл в теле запроса. Ниже приведен пример запроса почтальона. Я получил успешный ответ с содержанием ответа.

var client = new RestClient("https://***********");
var request = new RestRequest(Method.POST);
request.AddHeader("cache-control", "no-cache");
request.AddHeader("Connection", "keep-alive");
request.AddHeader("Content-Length", "757");

request.AddHeader("Accept-Encoding", "gzip, deflate");
request.AddHeader("Host", "**********");
request.AddHeader("Postman-Token", "********");
request.AddHeader("Cache-Control", "no-cache");
request.AddHeader("Accept", "*/*");
request.AddHeader("User-Agent", "PostmanRuntime/7.18.0");
request.AddHeader("Authorization", "Bearer XX");
request.AddHeader("Content-Type", "multipart/form-data");
request.AddHeader("content-type", "multipart/form-data; boundary=----WebKitFormBoundaryabc");
request.AddParameter("multipart/form-data; boundary=----WebKitFormBoundaryabc", "------WebKitFormBoundaryabc\r\nContent-Disposition: form-data; **name=\"\"**; filename=\"sample.csv\"\r\nContent-Type: text/csv\r\n\r\n\r\n------WebKitFormBoundaryabc--", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);

Фактический ожидаемый ответ от вызова API с использованием почтальона:

IssussessStatusCode: true{ ResponseData { file Name : "sample", readable :true} }

Я использовал метод C # httpClient, как показано ниже, для того же вызова

using (var _httpClient = new HttpClient())
{
    using (var stream = File.OpenRead(path))
    {
        _httpClient.DefaultRequestHeaders.Accept.Clear();
        _httpClient.DefaultRequestHeaders.Add("Accept", "*/*");
        _httpClient.DefaultRequestHeaders.Add("cache-control", "no-cache");
        _httpClient.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate");
        _httpClient.DefaultRequestHeaders.Add("Host", "*********");
        _httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer XX");

        _httpClient.DefaultRequestHeaders
            .Accept
            .Add(new MediaTypeWithQualityHeaderValue("multipart/form-data")); // ACCEPT header

        var content = new MultipartFormDataContent();
        var file_content = new ByteArrayContent(new StreamContent(stream).ReadAsByteArrayAsync().Result);
        file_content.Headers.ContentType = new MediaTypeHeaderValue("text/csv");
        file_content.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
        {
            FileName = "sample.csv",
            **Name = " ", // Is this correct. In postman request it is **name=\"\"****
        };
        content.Add(file_content);
        _httpClient.BaseAddress = new Uri("**************");
        var response = await _httpClient.PostAsync("****url", content);

        if (response.IsSuccessStatusCOde)
        {
            string responseBody = await response.Content.ReadAsStringAsync();
        }
    }
}

I am getting tresponse this way
Result: "\u001f�\b\0\0\0\0\0\u0004\0�\a`\u001cI�%&/m�{\u007fJ�J��t�\b�`\u0013$ؐ@\u0010������\u001diG#)�*��eVe]f\u0016@�흼��{���{���;�N'���?\\fd\u0001l��J�ɞ!���\u001f?~|\u001f?\"~�G�z:͛�G�Y�䣏��\u001e�⏦�,�������G\vj�]�_\u001f=+�<����/��������xR,�����4+�<�]����i�q��̳&O���,�\u0015��y�/۴�/�����r�������G��͊�pX������\a�\u001ae_�\0\0\0"

Here I get some decoded values when I execute `response.Content.ReadAsStringAsync();`

Can someone help me on what needs to be done here?

1 Ответ

1 голос
/ 18 октября 2019

Хорошо, я понимаю вашу проблему. API возвращает ответ в сжатом формате. Вам нужно Deflate/Gzip это. Я сталкивался с подобными проблемами ранее. Попробуйте мое решение.

Вам необходимо использовать класс HttpClientHandler() следующим образом.

var httpClientHandler = new HttpClientHandler()
{
  AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip
};
_httpClient = new HttpClient(httpClientHandler);

Когда экземпляр httpClient будет создан, вам нужно передать обработчик впервое место.

...