Opublikuj pustą treść w REST API za pośrednictwem HttpClient

119

API, które próbuję wywołać, wymaga wykonania POST, ale z pustą treścią. Jestem nowy w używaniu HttpClient interfejsu API WCF Web API i nie mogę znaleźć kodu zapisu, który wykonałby post z pustą treścią. Znajduję odniesienia do niektórych metod HttpContent.CreateEmpty (), ale nie sądzę, aby dotyczyło to kodu HttpClient interfejsu API sieci Web, ponieważ nie mogę znaleźć tej metody.

Ryan Rinaldi
źródło
HttpContent.CreateEmpty pochodzi ze starego prototypu HttpClient, który był częścią zestawu startowego REST. Niestety nie ma odpowiednika w nowym HttpClient.
Darrel Miller
1
@MichaelFreidgeim Jeśli w kontinuum czasoprzestrzennym była dziura i jakoś rok 2013 nastąpił przed 2011 rokiem, to tak, to jest możliwy duplikat.
Ryan Rinaldi
1
„Możliwy duplikat” to sposób na uporządkowanie - zamknięcie podobnych pytań i pozostawienie jednego z najlepszymi odpowiedziami. Data nie jest konieczna. Zobacz meta.stackexchange.com/questions/147643/… Jeśli zgadzasz się, że wymaga to wyjaśnienia, zagłosuj na meta.stackexchange.com/questions/281980/ ...
Michael Freidgeim

Odpowiedzi:

119

Użyj StringContentlub ObjectContentktóre pochodzą HttpContentlub możesz użyć nulljako HttpContent:

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

Alexander Zeitler
źródło
Wygląda na to, że jest to tylko w .NET Framework 4.5? msdn.microsoft.com/en-us/library/…
dan
Będzie dostarczany z WCF Web API, ale myślę, że niektóre z „dobrych części” trafią do samej struktury.
Alexander Zeitler,
Dlaczego nie ma żadnych metod przeciążania, które nie wymagają HttpContentklasy? Czy powinniśmy przynajmniej podać coś (nawet pusty ciąg znaków), aby utworzyć post http?
tugberk
75
Możesz użyć nulljako HttpContent, to nie wyśle ​​treści w żądaniu, np.var response = await client.PostAsync(requestUri, null);
Owain Williams
105

Robiłem to już wcześniej, po prostu nie komplikuj:

Task<HttpResponseMessage> task = client.PostAsync(url, null);
Ogglas
źródło
7
To jest czystsza niż zaakceptowana odpowiedź i powinna zostać przegłosowana.
David Ebbo,
4

Stwierdziłem, że:

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

Dodaje wartość null do treści żądania, które nie powiodło się na WSO2. Zastąpiony:

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

I działał.

Ryan Tuck
źródło
Nie mogę potwierdzić tego ustalenia (ale nie jestem pewien, czy mój test był całkowicie odpowiedni). Kiedy POST do jednego z moich własnych interfejsów API z nullzawartością i patrzę na zawartość znajdującą się w HttpRequestMessage, wydaje mi się, że otrzymuję długość równą zeru.
LUB Mapper
1

Aby rozwiązać ten problem, skorzystaj z tego przykładu:

   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
źródło
-6

Myślę, że robi to automagicznie, jeśli Twoja metoda internetowa nie ma parametrów lub wszystkie pasują do szablonu adresu URL.

Na przykład ta deklaracja wysyła puste treści:

  [OperationContract]
  [WebGet(UriTemplate = "mykewlservice/{emailAddress}",
     RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json,
     BodyStyle = WebMessageBodyStyle.Wrapped)]
  void GetStatus(string emailAddress, out long statusMask);
Ivan G.
źródło
Próbuję WYSŁAĆ puste ciało. Metoda HttpClient.Post () wymaga identyfikatora URI i obiektu HttpContent. Nie jestem tym, co podać jako HttpContent, gdy nie chcę niczego wysyłać.
Ryan Rinaldi
Więc nie używasz WCF. To jeszcze prostsze: ... HttpWebRequest request = (HttpWebRequest) WebRequest.Create ("http: // ..."); request.Method = "POST"; HttpWebResponse respose = (HttpWebResponse) request.GetResponse (); ... skutkuje w odpowiedzi
Ivan G.
1
Używam HttpClient, a nie HttpWebRequest. Używanie StringContent z pustym ciągiem działało.
Ryan Rinaldi