如何从 Httpclient.SendAsync 调用中获取和打印响应

Posted

技术标签:

【中文标题】如何从 Httpclient.SendAsync 调用中获取和打印响应【英文标题】:How to get and print response from Httpclient.SendAsync call 【发布时间】:2017-01-20 11:46:11 【问题描述】:

我正在尝试从 HTTP 请求中获取响应,但我似乎无法。我尝试了以下方法:

public Form1()      

    HttpClient client = new HttpClient();
    client.BaseAddress = new Uri("someUrl");
    string content = "someJsonString";
    HttpRequestMessage sendRequest = new HttpRequestMessage(HttpMethod.Post, client.BaseAddress);
    sendRequest.Content = new StringContent(content,
                                            Encoding.UTF8,
                                            "application/json");

发送消息:

    ...
    client.SendAsync(sendRequest).ContinueWith(responseTask =>
    
        Console.WriteLine("Response: 0", responseTask.Result);
    );
 // end public Form1()

使用此代码,我可以取回状态代码和一些标头信息,但我无法取回响应本身。我也试过:

  HttpResponseMessage response = await client.SendAsync(sendRequest);

然后我被告知要创建一个如下所示的异步方法以使其工作

private async Task<string> send(HttpClient client, HttpRequestMessage msg)

    HttpResponseMessage response = await client.SendAsync(msg);
    string rep = await response.Content.ReadAsStringAsync();

这是发送“HttpRequest”、获取并打印响应的首选方式吗?我不确定哪种方法是正确的。

【问题讨论】:

这样做没有错误或正确的方法。根据您的应用程序,两者都有意义。如果您不确定,我个人会推荐 async/await 方法。 我想没有办法将所有代码都包含在构造函数中吗?我现在只是在测试一个 api。 我不确定上述解决方案的问题是什么,但您也可以只使用 Result 属性。 var response = client.SendAsync(sendRequest).Result;请注意,您使用这种方法“失去”了异步性。这是阻塞(如等待)。 解决方案很好,只是尝试在构造函数中打印结果而不是创建异步方法,这似乎可以解决问题:HttpResponseMessage response = client.SendAsync(sendRequest).Result; var result = response.Content.ReadAsStringAsync().Result; 我还是不知道你说的是什么构造函数。很高兴你让它工作了;) 【参考方案1】:

这里有一种使用HttpClient的方法,这应该读取请求的响应,以防请求返回状态200,(请求不是BadRequestNotAuthorized

string url = 'your url here';

// usually you create on HttpClient per Application (it is the best practice)
HttpClient client = new HttpClient();

using (HttpResponseMessage response = client.GetAsync(url).Result)

    using (HttpContent content = response.Content)
    
         var json = content.ReadAsStringAsync().Result;
    

有关完整的详细信息以及如何将async/awaitHttpClient 一起使用,您可以阅读this answer 的详细信息

【讨论】:

您可能希望链接使用以减少嵌套。

以上是关于如何从 Httpclient.SendAsync 调用中获取和打印响应的主要内容,如果未能解决你的问题,请参考以下文章

C# HttpClient.SendAsync 在测试某些 URL 时抛出“发送请求时发生错误”异常

在 HttpClient.SendAsync() 之后无法访问已释放的对象

HttpClient.SendAsync() 未将 JSON 作为字符串发送

HttpClient.SendAsync 不发送请求正文

HttpClient.SendAsync 方法退出而不抛出异常

HttpClient SendAsync