首页 > 解决方案 > 如何调用 httpClient 请求 - 响应给出解码值

问题描述

我使用邮递员通过在请求正文中附加文件来发送发布请求。以下是邮递员请求示例。我得到了响应内容的成功响应。

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} }

我已使用httpClient如下 C# 方法进行相同的调用

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?

标签: c#asp.net-mvcfile-uploadhttpclient

解决方案


好的,我理解你的问题。api 以压缩格式返回响应。你需要Deflate/Gzip它。我之前也遇到过类似的问题。试试我的解决方案。

你需要HttpClientHandler()像这样使用这个类。

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

httpClient实例化时,您需要首先传入处理程序。


推荐阅读