Ich habe einen benutzerdefinierten komplexen Typ, mit dem ich mithilfe der Web-API arbeiten möchte.
public class Widget
{
public int ID { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
Und hier ist meine Web-API-Controller-Methode. Ich möchte dieses Objekt so posten:
public class TestController : ApiController
{
// POST /api/test
public HttpResponseMessage<Widget> Post(Widget widget)
{
widget.ID = 1; // hardcoded for now. TODO: Save to db and return newly created ID
var response = new HttpResponseMessage<Widget>(widget, HttpStatusCode.Created);
response.Headers.Location = new Uri(Request.RequestUri, "/api/test/" + widget.ID.ToString());
return response;
}
}
Und jetzt möchte ich System.Net.HttpClient
die Methode aufrufen. Ich bin mir jedoch nicht sicher, welche Art von Objekt an die PostAsync
Methode übergeben werden soll und wie sie erstellt werden soll. Hier ist ein Beispiel für einen Client-Code.
var client = new HttpClient();
HttpContent content = new StringContent("???"); // how do I construct the Widget to post?
client.PostAsync("http://localhost:44268/api/test", content).ContinueWith(
(postTask) =>
{
postTask.Result.EnsureSuccessStatusCode();
});
Wie erstelle ich das HttpContent
Objekt so, dass die Web-API es versteht?
c#
asp.net-web-api
indot_brad
quelle
quelle
Antworten:
Das Generikum
HttpRequestMessage<T>
wurde entfernt . Dies :wird nicht mehr funktionieren .
Stattdessen hat das ASP.NET-Team in diesem Beitrag einige neue Aufrufe aufgenommen , um diese Funktionalität zu unterstützen:
Der neue Code ( von Dunston ) lautet also :
quelle
HttpClient.PostAsXXXAsync<T>( T value ) methods are great, but what about one for application/x-www-form-urlencoded format? Is there a simple / short way for that or do we still need to create elaborate
KeyValuePair-Listen?PostUrlEncodedAsync
.PostAsJsonAsync
oderPostAsXmlAsync
Sie sollten
SendAsync
stattdessen die Methode verwenden. Dies ist eine generische Methode, die die Eingabe für den Dienst serialisiertWenn Sie die konkrete Klasse nicht erstellen möchten, können Sie sie mit der
FormUrlEncodedContent
Klasse erstellenHinweis: Sie müssen Ihre ID auf nullable int (
int?
) setzen.quelle
Beachten Sie, dass HttpClient bei Verwendung einer Portable Class Library nicht über die PostAsJsonAsync-Methode verfügt . Um einen Inhalt als JSON mithilfe einer Portable Class Library zu veröffentlichen, müssen Sie Folgendes tun:
quelle
Wenn Sie die in anderen Antworten genannten Arten von Convenience-Methoden möchten, aber Portabilität benötigen (oder auch nicht), sollten Sie sich Flurl ansehen [Offenlegung: Ich bin der Autor]. Es (dünn) wickelt
HttpClient
und Json.NET und fügt einige fließend Zucker und andere Leckereien, darunter auch einige backene in Helfer zu testen .Post als JSON:
oder URL-codiert:
Beide obigen Beispiele geben ein zurück
HttpResponseMessage
, aber Flurl enthält Erweiterungsmethoden zum Zurückgeben anderer Dinge, wenn Sie nur auf den Punkt kommen möchten:Flurl ist auf NuGet verfügbar:
quelle
Nachdem ich viele Alternativen untersucht habe, bin ich auf einen anderen Ansatz gestoßen, der für die API 2.0-Version geeignet ist.
(VB.NET ist mein Favorit, sooo ...)
Viel Glück! Für mich hat das geklappt (am Ende!).
Grüße, Peter
quelle
Ich denke, Sie können dies tun:
quelle
Für den Fall, dass jemand wie ich nicht wirklich verstanden hat, worüber alle oben genannten sprechen, gebe ich ein einfaches Beispiel, das für mich funktioniert. Wenn Sie eine Web-API mit der URL " http://somesite.com/verifyAddress " haben, handelt es sich um eine Post-Methode, für die Sie ein Adressobjekt übergeben müssen. Sie möchten diese API in Ihrem Code aufrufen. Hier was du machen kannst.
quelle
Dies ist der Code, mit dem ich abgeschlossen habe, basierend auf den anderen Antworten hier. Dies ist für einen HttpPost, der komplexe Typen empfängt und mit diesen antwortet:
quelle
Machen Sie einen Serviceabruf wie folgt:
Und Service-Methode wie folgt:
PutAsJsonAsync kümmert sich um die Serialisierung und Deserialisierung über das Netzwerk
quelle
PostAsJsonAsync
werden die erforderlichen Daten als POST in JSON gesendet.