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?

19
demandé sur mark_h 2013-03-04 19:45:27

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.

45
répondu Cuong Le 2015-07-12 21:01:51

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.

28
répondu Todd Menier 2014-03-23 18:47:24

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!

10
répondu Stephen Lautier 2018-02-08 18:50:31

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.

2
répondu Davin Tryon 2013-03-04 15:47:50

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
            }
2
répondu Xaris Fytrakis 2013-07-16 13:47:07