Veröffentlichen Sie einen leeren Text über HttpClient in der REST-API


118

Die API, die ich aufrufen möchte, erfordert, dass ich einen POST durchführe, jedoch mit einem leeren Körper. Ich bin neu in der Verwendung der WCF-Web-API HttpClient und kann den Schreibcode, der einen Beitrag mit einem leeren Text erstellen würde, anscheinend nicht herausfinden. Ich finde Verweise auf eine HttpContent.CreateEmpty () -Methode, aber ich glaube nicht, dass dies für den HttpClient-Code der Web-API gilt, da ich diese Methode scheinbar nicht finden kann.


HttpContent.CreateEmpty stammt aus dem alten HttpClient-Prototyp, der Teil des REST Starter-Kits war. Leider gibt es im neuen HttpClient kein Äquivalent.
Darrel Miller


1
@MichaelFreidgeim Wenn es ein Loch im Raum-Zeit-Kontinuum gab und 2013 irgendwie vor 2011 kam, dann ist es ja ein mögliches Duplikat.
Ryan Rinaldi

1
"Mögliches Duplikat" ist ein Weg zur Bereinigung - um ähnliche Fragen zu schließen und eine mit den besten Antworten zu behalten. Das Datum ist nicht wesentlich. Siehe meta.stackexchange.com/questions/147643/… Wenn Sie damit einverstanden sind, dass eine Klärung erforderlich ist, stimmen Sie bitte über meta.stackexchange.com/questions/281980/… ab
Michael Freidgeim

Antworten:


117

Verwenden Sie StringContentoder ObjectContentwelche stammen von HttpContentoder Sie können verwenden nullals HttpContent:

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


Es sieht so aus, als wäre dies nur in .NET Framework 4.5? msdn.microsoft.com/en-us/library/…
dan

Es wird mit der WCF-Web-API ausgeliefert, aber ich denke, einige der "guten Teile" werden es in das Framework selbst schaffen.
Alexander Zeitler

Warum gibt es keine Überladungsmethoden, für die keine HttpContentKlasse erforderlich ist ? Sollten wir zumindest etwas (sogar eine leere Zeichenfolge) bereitstellen, um einen http-Beitrag zu erstellen?
Tugberk

75
Sie können nullals verwenden HttpContent, dies wird keine Stelle in der Anfrage senden, zBvar response = await client.PostAsync(requestUri, null);
Owain Williams

105

Haben Sie das schon einmal gemacht, halten Sie es einfach:

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

7
Dies ist sauberer als die akzeptierte Antwort und sollte abgestimmt werden.
David Ebbo

4

Habe das gefunden:

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

Fügt dem Anforderungshauptteil null hinzu, was bei WSO2 fehlgeschlagen ist. Ersetzt mit:

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

Und gearbeitet.


Ich kann diesen Befund nicht bestätigen (aber ich bin nicht sicher, ob mein Test völlig ausreichend war). Wenn ich auf eine meiner eigenen APIs mit einem nullInhalt poste und mir den Inhalt in der HttpRequestMessageansehe, erhalte ich anscheinend eine Länge von null Bytes.
ODER Mapper

1

Verwenden Sie dieses Beispiel, um dieses Problem zu lösen:

   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

Ich denke, das funktioniert automatisch, wenn Ihre Webmethode keine Parameter hat oder alle in eine URL-Vorlage passen.

Zum Beispiel sendet diese Deklaration einen leeren Körper:

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

Ich versuche einen leeren Körper zu senden. Die Methode HttpClient.Post () erfordert einen URI und ein HttpContent-Objekt. Ich bin nicht das, was ich als HttpContent übergeben soll, wenn ich nichts senden möchte.
Ryan Rinaldi

Sie verwenden also kein WCF. Das ist noch einfacher: ... HttpWebRequest request = (HttpWebRequest) WebRequest.Create ("http: // ..."); request.Method = "POST"; HttpWebResponse respose = (HttpWebResponse) request.GetResponse (); ... Sie führen zu einer Antwort
Ivan G.

1
Ich verwende HttpClient, nicht HttpWebRequest. Die Verwendung von StringContent mit einer leeren Zeichenfolge hat funktioniert.
Ryan Rinaldi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.