Publier un corps vide sur l'API REST via HttpClient


119

L'API que j'essaie d'appeler nécessite que je fasse un POST mais avec un corps vide. Je suis nouveau dans l'utilisation de l'API Web WCF HttpClient et je n'arrive pas à trouver le code d'écriture qui ferait une publication 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 HttpClient de l'API Web car je n'arrive pas à trouver cette méthode.


HttpContent.CreateEmpty provenait 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.
Darrel Miller


1
@MichaelFreidgeim S'il y avait un trou dans le continuum spatio-temporel et qu'en quelque sorte 2013 est arrivé avant 2011, alors oui c'est un doublon possible.
Ryan Rinaldi

1
«Possible duplicate» est un moyen de nettoyer - pour fermer des questions similaires et en garder une avec les meilleures réponses. La date n'est pas indispensable. Voir meta.stackexchange.com/questions/147643/… Si vous acceptez que cela nécessite des éclaircissements, veuillez voter sur meta.stackexchange.com/questions/281980/…
Michael Freidgeim

Réponses:


119

Utilisez StringContentou ObjectContentqui dérivent de HttpContentou vous pouvez utiliser nullcomme HttpContent:

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


Il semble que ce ne soit que dans .NET Framework 4.5? msdn.microsoft.com/en-us/library/…
dan

Il sera livré avec l'API Web WCF mais je pense que certaines des "bonnes parties" le feront dans le cadre lui-même.
Alexander Zeitler

Pourquoi n'y a-t-il pas de méthodes de surcharge qui ne nécessitent pas de HttpContentclasse? Devrions-nous au moins fournir quelque chose (même une chaîne vide) pour créer un message http?
tugberk

75
Vous pouvez utiliser nullcomme HttpContent, cela n'enverra aucun corps dans la demande, par exemplevar response = await client.PostAsync(requestUri, null);
Owain Williams

105

J'ai fait cela avant, restez simple:

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

7
C'est une réponse plus propre que acceptée et devrait être votée.
David Ebbo

4

Ont constaté que:

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

Ajoute null au corps de la demande, qui a échoué sur WSO2. Remplacé par:

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

Et travaillé.


Je ne peux pas confirmer ce résultat (mais je ne suis pas sûr que mon test ait été totalement adéquat). Lorsque je POSTE sur l'une de mes propres API avec un nullcontenu et que HttpRequestMessageje regarde le contenu trouvé dans le , il semble que je reçoive une longueur de zéro octet.
OR Mapper

1

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;
            }

-6

Je pense qu'il le fait automatiquement si votre méthode Web n'a pas de paramètres ou s'ils s'intègrent 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);

J'essaye d'envoyer un corps vide. La méthode HttpClient.Post () nécessite un URI et un objet HttpContent. Je ne suis pas ce que je dois passer comme HttpContent quand je ne veux rien envoyer.
Ryan Rinaldi

Vous n'utilisez donc pas WCF. C'est encore plus simple: ... HttpWebRequest request = (HttpWebRequest) WebRequest.Create ("http: // ..."); request.Method = "POST"; HttpWebResponse respose = (HttpWebResponse) request.GetResponse (); ... vous obtenez une réponse
Ivan G.

1
J'utilise HttpClient, pas HttpWebRequest. L'utilisation de StringContent avec une chaîne vide a fonctionné.
Ryan Rinaldi
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.