web-dev-qa-db-fra.com

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éen pour s'assurer que l'objet a été enregistré, mais comment renvoyer cette réponse booléenne?

Continuez à obtenir du contenu:

var httpClient = new HttpClient();
var response = httpClient.PostAsJsonAsync(posturi, model).Result;
bool returnValue = response.Content.ReadAsAsync<bool>().Result;

Mais, c'est une approche vraiment naïve pour un moyen rapide d'obtenir des résultats. PostAsJsonAsync et ReadAsAsync n'est pas conçu pour faire comme ça, 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 indicateur pour vérifier si un objet est enregistré ou non, vous devez utiliser les codes HTTP en renvoyant 200 OK pour déterminer que l'enregistrement a réussi.

49
cuongle

La réponse acceptée est techniquement correcte mais bloque le fil de discussion actuel sur les appels à .Result. Si vous utilisez .NET 4.5 ou supérieur, vous devez éviter cela dans presque toutes les situations. Utilisez à la place la version asynchrone (non bloquante) équivalente:

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ée async et doit elle-même être awaited.

33
Todd Menier

Puisqu'il s'agit d'une opération asynchrone, ne le faites pas immédiatement.

Au lieu de cela, vous devez le faire asynchrone en procédant comme suit:

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;

REMARQUE: je viens de les écrire ici, donc je ne les ai pas testés, mais c'est plus ou moins ce que vous voulez.

J'espère que ça aide!

9
Stephen Lautier

Si vous appelez la version générique, elle devrait vous redonner le booléen:

var response = new HttpClient().PostAsJsonAsync<bool>(posturi, model).Result;

Au moins selon les docs .

2
Davin Tryon

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 dans le contrôleur, vérifiez comme ceci:

   HttpStatusCode update = staffrest.PostStaffPositions(foo);
            if (update == HttpStatusCode.OK)
            {
               //Update Succeed
            }
            else
            {
                //Update Failed
            }
2
Xaris Fytrakis