【发布时间】: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; -
我还是不知道你说的是什么构造函数。很高兴你让它工作了;)
标签: c# asynchronous httpclient