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.


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


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

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ł.


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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.