Obtenir une réponse de PostAsJsonAsync
j'ai cette ligne de code
var response = new HttpClient().PostAsJsonAsync(posturi, model).Result;
Le contrôleur WebAPI appelé renvoie un bool pour s'assurer que l'objet a été sauvegardé, mais comment retourner cette réponse de bool?
5 réponses
Continuer à obtenir de contenu:
var httpClient = new HttpClient();
var response = httpClient.PostAsJsonAsync(posturi, model).Result;
bool returnValue = response.Content.ReadAsAsync<bool>().Result;
Mais, c'est vraiment une approche naïve de façon rapide d'obtenir de résultat. PostAsJsonAsync
et ReadAsAsync
n'est pas conçu pour faire comme ceci, ils sont conçus pour supporter async await
programmation, donc votre code devrait être:
var httpClient = new HttpClient();
var response = await httpClient.PostAsJsonAsync(posturi, model);
bool returnValue = await response.Content.ReadAsAsync<bool>();
de plus, au lieu d'utiliser un drapeau pour vérifier si un objet est sauvegardé ou non, vous devriez utiliser les codes HTTP en retournant 200 OK
déterminer que l'épargne est réussie.
la réponse acceptée est techniquement correcte mais bloque le thread courant sur les appels vers .Result
. Si vous utilisez .NET 4.5 ou plus, vous devriez éviter cela dans presque toutes les situations. Utilisez plutôt la version asynchrone équivalente (non-bloquante):
var httpClient = new HttpClient();
var response = await httpClient.PostAsJsonAsync(posturi, model);
bool returnValue = await response.Content.ReadAsAsync<bool>();
Notez que la méthode contenant le code ci-dessus doit être marqué async
, et devrait être lui-même await
ed.
Depuis sa une opération Asynchrone ne pas faire .Résultat incorrect
au lieu de cela vous devez le faire async en faisant ceci:
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;
NOTE: je viens de les écrire ici, donc je ne les ai pas vraiment testées mais plus ou moins c'est ce que vous voulez.
j'espère que cela aide!
Si vous appelez la version générique, il devrait vous redonner le bool:
var response = new HttpClient().PostAsJsonAsync<bool>(posturi, model).Result;
Au moins la documentation.
J'ai utilisé HttpStatusCode pour vérifier le résultat.
public HttpStatusCode PostStaffPositions(Foo foo)
{
string uri = myapiuri;
using (HttpClient httpClient = new HttpClient())
{
var response = httpClient.PostAsJsonAsync(uri, foo).Result;
return response.StatusCode;
}
}
Et puis au Contrôleur de vérifier comme ceci:
HttpStatusCode update = staffrest.PostStaffPositions(foo);
if (update == HttpStatusCode.OK)
{
//Update Succeed
}
else
{
//Update Failed
}