c# - postasync - Obtener respuesta de PostAsJsonAsync
postasjsonasync c# (5)
Tengo esta linea de codigo
var response = new HttpClient().PostAsJsonAsync(posturi, model).Result;
El controlador llamado WebAPI devuelve un bool para asegurarse de que se guardó el objeto, pero ¿cómo devuelvo esa respuesta de bool?
Continuar obteniendo de contenido:
var httpClient = new HttpClient();
var response = httpClient.PostAsJsonAsync(posturi, model).Result;
bool returnValue = response.Content.ReadAsAsync<bool>().Result;
Pero, este es un enfoque realmente ingenuo para obtener resultados rápidamente. PostAsJsonAsync
y ReadAsAsync
no están diseñados para hacer esto, están diseñados para admitir la programación async await
, por lo que su código debe ser:
var httpClient = new HttpClient();
var response = await httpClient.PostAsJsonAsync(posturi, model);
bool returnValue = await response.Content.ReadAsAsync<bool>();
Además, en lugar de utilizar un indicador para verificar si un objeto está guardado o no, debe utilizar los códigos HTTP devolviendo 200 OK
para determinar que el ahorro se realizó correctamente.
La respuesta aceptada es técnicamente correcta pero bloquea el hilo actual en las llamadas a .Result
. Si está utilizando .NET 4.5 o superior, debe evitarlo en casi todas las situaciones. En su lugar, use la versión asíncrona equivalente (sin bloqueo):
var httpClient = new HttpClient();
var response = await httpClient.PostAsJsonAsync(posturi, model);
bool returnValue = await response.Content.ReadAsAsync<bool>();
Tenga en cuenta que el método que contiene el código anterior debe marcarse como async
, y debe estar en await
.
Si llama a la versión genérica, debería devolverle el bool:
var response = new HttpClient().PostAsJsonAsync<bool>(posturi, model).Result;
Al menos según los documentos .
Usé HttpStatusCode para verificar el resultado.
public HttpStatusCode PostStaffPositions(Foo foo)
{
string uri = myapiuri;
using (HttpClient httpClient = new HttpClient())
{
var response = httpClient.PostAsJsonAsync(uri, foo).Result;
return response.StatusCode;
}
}
Y luego en Controlador, compruébalo así:
HttpStatusCode update = staffrest.PostStaffPositions(foo);
if (update == HttpStatusCode.OK)
{
//Update Succeed
}
else
{
//Update Failed
}
Ya que es una operación Async, no hagas inmediatamente .Resultar como está mal
En su lugar, debes hacerlo asíncrono haciendo esto:
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;
NOTA: los escribí aquí, así que en realidad no los probé, pero más o menos eso es lo que quieres.
¡Espero que ayude!