我有这行代码
var response = new HttpClient().PostAsJsonAsync(posturi, model).Result;
被调用的WebAPI控制器返回一个bool以确保该对象已保存,但如何返回该bool响应?
答案 0 :(得分:49)
继续从内容获取:
var httpClient = new HttpClient();
var response = httpClient.PostAsJsonAsync(posturi, model).Result;
bool returnValue = response.Content.ReadAsAsync<bool>().Result;
但是,这是一种非常天真的方法,可以快速获得结果。 PostAsJsonAsync
和ReadAsAsync
不是为此而设计的,它们旨在支持async await
编程,因此您的代码应为:
var httpClient = new HttpClient();
var response = await httpClient.PostAsJsonAsync(posturi, model);
bool returnValue = await response.Content.ReadAsAsync<bool>();
此外,您应该通过返回200 OK
来确定保存是否成功,而不是使用标志来检查对象是否已保存,而应使用HTTP代码。
答案 1 :(得分:33)
接受的答案在技术上是正确的,但在调用.Result
时阻止当前线程。如果您使用的是.NET 4.5或更高版本,则应该在几乎所有情况下都避免使用它。相反,使用等效的异步(非阻塞)版本:
var httpClient = new HttpClient();
var response = await httpClient.PostAsJsonAsync(posturi, model);
bool returnValue = await response.Content.ReadAsAsync<bool>();
请注意,包含上述代码的方法需要标记为async
,并且本身应为await
。
答案 2 :(得分:9)
由于它的异步操作不会立即将.Result视为错误的
相反,你需要通过这样做来实现异步:
var httpClient = new HttpClient()
var task = httpClient.PostAsJsonAsync(posturi, model)
.ContinueWith( x => x.Result.Content.ReadAsAsync<bool>().Result);
// 1. GETTING RESPONSE - NOT ASYNC WAY
task.Wait(); //THIS WILL HOLD THE THREAD AND IT WON'T BE ASYNC ANYMORE!
bool response = task.Result
// 2. GETTING RESPONSE - TASK ASYNC WAY (usually used in < .NET 4.5
task.ContinueWith( x => {
bool response = x.Result
});
// 3. GETTING RESPONSE - TASK ASYNC WAY (usually used in >= .NET 4.5
bool response = await task;
注意:我刚刚在这里写了它们,所以我没有真正测试它们,但或多或少是你想要的。
我希望它有所帮助!
答案 3 :(得分:2)
如果你打电话给通用版,它应该给你回复bool:
var response = new HttpClient().PostAsJsonAsync<bool>(posturi, model).Result;
至少根据the docs。
答案 4 :(得分:2)
我使用HttpStatusCode检查结果。
public HttpStatusCode PostStaffPositions(Foo foo)
{
string uri = myapiuri;
using (HttpClient httpClient = new HttpClient())
{
var response = httpClient.PostAsJsonAsync(uri, foo).Result;
return response.StatusCode;
}
}
然后在Controller中检查它:
HttpStatusCode update = staffrest.PostStaffPositions(foo);
if (update == HttpStatusCode.OK)
{
//Update Succeed
}
else
{
//Update Failed
}
答案 5 :(得分:0)
现在是 2021 年 7 月,我正在使用 .net 5(即 .net core 5)。
我在 System.Net.Http 中没有看到上面的任何通用方法。现在代码看起来像这样(经过测试):
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("https://localhost:44330/api/Book/Add");
var response = client.PostAsJsonAsync(client.BaseAddress,
JsonSerializer.Serialize(_teamSummaries));
MessageBox.Show(@"Result is " + JsonSerializer.Serialize(response));
var returnValue = response.Result.Content.ReadAsStringAsync();
MessageBox.Show(@"Return value is " + returnValue.Result);
}
还有ReadAsStringAsync、ReadAsByteArrayAsync、ReadAsStream、ReadFromJsonAsync、ReadFromJsonAsync(这个方法返回Task)。
但是从字面意思是“ReadFromJsonAsync”,我觉得T并不是上面提到的bool,而是一个包含bool成员的类。如果您想退回书籍之类的东西,请尝试一下。
另一方面,因为服务器上的代码看起来像这样(.net 5):
[HttpPost]
[Route("Add")]
public async Task<ActionResult<IEnumerable<Book>>> Add(string value)
{
var all = await _dbCollection.FindAsync(Builders<Book>.Filter.Empty);
return Ok("Everything is ok.");
}
所以,如果我们想通过 bool 返回 true,我们应该返回 Ok(...)。如果我们想通过 bool 返回 false,我们应该返回其他内容。还有 20 多种其他类型的结果,其中包含更多信息,而不仅仅是“错误”。