IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

Web API - Problème avec les appels PostAsync (http Rest)


Sujet :

ASP.NET

  1. #1
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2020
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2020
    Messages : 30
    Par défaut Web API - Problème avec les appels PostAsync (http Rest)
    Bonjour,

    J’ai un big problème avec le routage (je suppose) pour les appels http Post. J’utilise .Net 6.

    J’ai l’appel suivant qui fonctionne bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    HttpResponseMessage response1 = await client.GetAsync("http://localhost:6000/api/" + "Utilisateur/AjouterUtilisateur1/" + "Machaine");
    Sur la classe UtilisateurController, j’ai le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    [Route("api/[controller]")]
    [ApiController]
    public class UtilisateurController : Controller
     
    [HttpPost("AjouterUtilisateur1/{jsonArgs}")]
    public ActionResult<string> AjouterUtilisateur1(string jsonArgs)       
    {}
    Cela fonctionne bien.

    Maintenant , je voudrais faire un Post au lieu du Get. Donc sur l’appelant, j’ai le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    HttpContent httpContent1 = new StringContent("MaChaine", Encoding.UTF8);
    HttpResponseMessage response1 = await client.PostAsync("http://localhost:6000/api/" + "Utilisateur/AjouterUtilisateur1", httpContent1);
    Et sur le serveur, j’ai le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    [Route("api/[controller]")]
    ApiController]
    public class UtilisateurController : Controller
     
    [HttpPost("AjouterUtilisateur1")]
    public ActionResult<string> AjouterUtilisateur1(string jsonArgs)       
    {}
    Le constructeur de la classe est bien exécuté mais c’est tout.
    Cela me donne l’erreur suivante dans response1 (au niveau de l’appelant) :
    {StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 1.1, Content: System.Net.Http.HttpConnectionResponseContent, Headers:
    {
    Date: Fri, 14 Jul 2023 17:37:53 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    Content-Type: application/problem+json; charset=utf-8
    }}

    Merci pour votre aide !

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 921
    Par défaut
    C'est normal.
    En REST, une méthode POST attend un objet et pas une simple chaine

  3. #3
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2020
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2020
    Messages : 30
    Par défaut
    Merci popo pour ton aide (avec un peu/bcp de retard car j'ai été pris sur un autre problème plus urgent).

    Je pense que tu veux parler de PostAsJsonAsync mais dans ce cas, j'ai toujours une erreur "Bad request".

    J'ai essayé PostAsJsonAsync en ayant sérialisé l'objet en amont et ça marche (donc avec une string au format json).

    J'aimerais pourtant que PostAsJsonAsync fonctionne directement avec un objet (comme tu l'écris). Il ferait alors la sérialisation de l'objet lui-même. Il faut certainement le paramétrer (?) pour qu'il fasse une sérialisation correcte de mon objet, mais comment ?

    Est-ce que quelqu'un sait comment faire svp ?

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 921
    Par défaut
    En REST, une méthode POST attend un objet et pas une simple chaine.
    Donc la première chose à faire est de demander un objet dans ton contrôleur et pas une chaine.

    Ensuite, tu pourras appeler PostAsJsonAsync
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    using (var client = new HttpClient())
                {
                    client.BaseAddress = new Uri("http://localhost:4810//");
                    client.DefaultRequestHeaders.Accept.Clear();
                    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
     
                    // HTTP POST
                    var user = new UserDto() { Id = Guid.NewGuid(), Name = "My Name is Pepper" };
     
                    HttpResponseMessage response = await client.PostAsJsonAsync("api/user/AjouterUtilisateur1", user);
     
                    if (response.IsSuccessStatusCode)
                    {
                        Console.WriteLine("Sucsesfully posted a user");
                    }
                }

  5. #5
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2020
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2020
    Messages : 30
    Par défaut
    Ça marche ! Un grand merci popo !

    Il manquait les deux lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    Je n'ai pas l'impression que la nécessité de ces deux lignes soit mise en avant par MSFT.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Web Service][SOAP] Problème avec les cookies
    Par bilel.1st dans le forum Bibliothèques et frameworks
    Réponses: 8
    Dernier message: 12/05/2008, 17h30
  2. Réponses: 5
    Dernier message: 17/01/2008, 13h18
  3. [CGI-BIN] Problèmes avec les appels systèmes
    Par ozyamdias dans le forum Apache
    Réponses: 1
    Dernier message: 27/08/2007, 17h17
  4. Problème avec les API
    Par Bertr@nd dans le forum Windows Forms
    Réponses: 20
    Dernier message: 14/07/2007, 14h53
  5. Réponses: 5
    Dernier message: 06/08/2006, 19h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo