163 votes

Poster un corps vide à l'API REST via HttpClient

L'API que j'essaie d'appeler exige que je fasse un POST mais avec un corps vide. Je suis novice dans l'utilisation de l'API Web WCF HttpClient et je ne parviens pas à trouver le code d'écriture qui permettrait d'effectuer un post avec un corps vide. Je trouve des références à une méthode HttpContent.CreateEmpty(), mais je ne pense pas que ce soit pour le code de l'API Web HttpClient puisque je n'arrive pas à trouver cette méthode.

0 votes

HttpContent.CreateEmpty provient de l'ancien prototype HttpClient qui faisait partie du kit de démarrage REST. Malheureusement, il n'y a pas d'équivalent dans le nouveau HttpClient.

1 votes

@MichaelFreidgeim S'il y avait un trou dans le continuum espace-temps et que, d'une manière ou d'une autre, 2013 était antérieur à 2011, alors oui, c'est un double possible.

184voto

Alexander Zeitler Points 2141

Utilisez StringContent o ObjectContent qui découlent de HttpContent ou vous pouvez utiliser null comme HttpContent :

var response = await client.PostAsync(requestUri, null);

0 votes

Il semble que cela ne soit possible que dans .NET framework 4.5 ? msdn.microsoft.com/fr/us/library/

0 votes

Il sera livré avec l'API Web WCF, mais je pense que certaines des "bonnes parties" seront intégrées dans le cadre lui-même.

0 votes

Pourquoi n'y a-t-il pas de méthode de surcharge qui ne nécessite pas un nom de domaine. HttpContent classe ? Devrions-nous au moins fournir quelque chose (même une chaîne vide) pour faire un post http ?

119voto

Ogglas Points 1

J'ai déjà fait ça avant, il faut rester simple :

Task<HttpResponseMessage> task = client.PostAsync(url, null);

8 votes

C'est plus propre que la réponse acceptée, et devrait être voté en haut.

6voto

Ryan Tuck Points 51

J'ai trouvé ça :

Task<HttpResponseMessage> task = client.PostAsync(url, null);

Ajoute null au corps de la requête, ce qui a échoué sur WSO2. Remplacé par :

Task<HttpResponseMessage> task = client.PostAsync(url, new {});

Et ça a marché.

0 votes

Je ne peux pas confirmer cette constatation (mais je ne suis pas sûr que mon test était totalement adéquat). Lorsque j'envoie un POST à l'une de mes propres API avec un fichier null et regarder le contenu trouvé dans le HttpRequestMessage il semble que j'obtienne une longueur de zéro octet.

1voto

Pour résoudre ce problème, utilisez cet exemple :

   using (var client = new HttpClient())
            {
                var stringContent = new StringContent(string.Empty);
                stringContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/x-www-form-urlencoded");
                var response = client.PostAsync(url, stringContent).Result;
                var result = response.Content.ReadAsAsync<model>().Result;
            }

-6voto

aloneguid Points 2122

Je pense qu'il le fait automatiquement si votre méthode web n'a pas de paramètres ou s'ils entrent tous dans le modèle d'URL.

Par exemple, cette déclaration envoie un corps vide :

  [OperationContract]
  [WebGet(UriTemplate = "mykewlservice/{emailAddress}",
     RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json,
     BodyStyle = WebMessageBodyStyle.Wrapped)]
  void GetStatus(string emailAddress, out long statusMask);

0 votes

J'essaie d'ENVOYER un corps vide. La méthode HttpClient.Post() requiert un URI et un objet HttpContent. Je ne sais pas quoi passer comme objet HttpContent si je ne veux rien envoyer.

0 votes

Donc vous n'utilisez pas WCF. C'est encore plus simple : ... HttpWebRequest request = (HttpWebRequest) WebRequest.Create("http://...") ; request.Method = "POST" ; HttpWebResponse respose = (HttpWebResponse)request.GetResponse() ; ... vous obtenez le résultat de la réponse

1 votes

J'utilise HttpClient, pas HttpWebRequest. L'utilisation de StringContent avec une chaîne vide a fonctionné.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X