Pubblica un corpo vuoto nell'API REST tramite HttpClient


119

L'API che sto cercando di chiamare richiede che esegua un POST ma con un corpo vuoto. Sono nuovo nell'usare l'API Web WCF HttpClient e non riesco a trovare il codice di scrittura che farebbe un post con un corpo vuoto. Trovo riferimenti ad alcuni metodi HttpContent.CreateEmpty (), ma non penso che sia per il codice HttpClient dell'API Web poiché non riesco a trovare quel metodo.


HttpContent.CreateEmpty proveniva dal vecchio prototipo HttpClient che faceva parte del REST Starter kit. Sfortunatamente non esiste un equivalente nel nuovo HttpClient.
Darrel Miller,


1
@MichaelFreidgeim Se c'era un buco nel continuum spazio-temporale e in qualche modo il 2013 è arrivato prima del 2011, allora sì, è un possibile duplicato.
Ryan Rinaldi

1
"Possibile duplicato" è un modo per ripulire - per chiudere domande simili e conservarne una con le risposte migliori. La data non è essenziale. Vedi meta.stackexchange.com/questions/147643/… Se sei d'accordo che richiede chiarimenti, vota su meta.stackexchange.com/questions/281980/…
Michael Freidgeim

Risposte:


118

Usa StringContento ObjectContentche derivano da HttpContento puoi utilizzare nullcome HttpContent:

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


Sembra che questo sia solo in .NET Framework 4.5? msdn.microsoft.com/en-us/library/…
dan

Verrà fornito con l'API Web WCF, ma penso che alcune delle "parti buone" entreranno nel framework stesso.
Alexander Zeitler

Perché non esistono metodi di sovraccarico che non richiedono una HttpContentclasse? Dovremmo almeno fornire qualcosa (anche una stringa vuota) per creare un post http?
Tugberk

75
Puoi usare nullcome HttpContent, questo non invierà alcun corpo nella richiesta, ad esempiovar response = await client.PostAsync(requestUri, null);
Owain Williams,

105

L'ho già fatto, mantienilo semplice:

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

7
Questa è una risposta più pulita di quella accettata e dovrebbe essere votata.
David Ebbo

4

Ho scoperto che:

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

Aggiunge null al corpo della richiesta, che non è riuscita su WSO2. Sostituito con:

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

E ha funzionato.


Non posso confermare questo risultato (ma non sono sicuro che il mio test fosse del tutto adeguato). Quando POST a una delle mie API con un nullcontenuto e guardo il contenuto trovato in HttpRequestMessage, mi sembra di ottenere una lunghezza di zero byte.
OPPURE Mapper

1

Per risolvere questo problema, usa questo esempio:

   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

Penso che lo faccia automaticamente se il tuo metodo web non ha parametri o se si adattano tutti al modello di URL.

Ad esempio questa dichiarazione invia un corpo vuoto:

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

Sto cercando di INVIARE un corpo vuoto. Il metodo HttpClient.Post () richiede un URI e un oggetto HttpContent. Non sono cosa passare come HttpContent quando non voglio inviare nulla.
Ryan Rinaldi

Quindi non stai usando WCF. È ancora più semplice: ... HttpWebRequest request = (HttpWebRequest) WebRequest.Create ("http: // ..."); request.Method = "POST"; HttpWebResponse respose = (HttpWebResponse) request.GetResponse (); ... si traduce in risposta
Ivan G.

1
Sto usando HttpClient, non HttpWebRequest. L'utilizzo di StringContent con una stringa vuota ha funzionato.
Ryan Rinaldi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.