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.

Ryan Rinaldi
la source
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
Double
Michael Freidgeim
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);

Alexander Zeitler
la source
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);
Ogglas
la source
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é.

Ryan Tuck
la source
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;
            }
abolfazl mousavi
la source
-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);
Ivan G.
la source
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