如何从 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,(请求不是BadRequest
或NotAuthorized
)
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/await
与HttpClient
一起使用,您可以阅读this answer 的详细信息
【讨论】:
您可能希望链接使用以减少嵌套。以上是关于如何从 Httpclient.SendAsync 调用中获取和打印响应的主要内容,如果未能解决你的问题,请参考以下文章
C# HttpClient.SendAsync 在测试某些 URL 时抛出“发送请求时发生错误”异常
在 HttpClient.SendAsync() 之后无法访问已释放的对象
HttpClient.SendAsync() 未将 JSON 作为字符串发送