Ich benutze System.Net.Http
, ich habe mehrere Beispiele im Web gefunden. Ich habe es geschafft, diesen Code für eine POST
Anfrage zu erstellen :
public static string POST(string resource, string token)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(baseUri);
client.DefaultRequestHeaders.Add("token", token);
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("", "")
});
var result = client.PostAsync("", content).Result;
string resultContent = result.Content.ReadAsStringAsync().Result;
return resultContent;
}
}
alles funktioniert gut. Angenommen, ich möchte einen dritten Parameter an die POST
Methode übergeben, einen Parameter namens data
. Der Datenparameter ist ein Objekt wie das folgende:
object data = new
{
name = "Foo",
category = "article"
};
wie kann ich das machen ohne das zu erstellen KeyValuePair
? Mein PHP RestAPI
wartet auf eine JSON-Eingabe, daher FormUrlEncodedContent
sollte der raw
JSON korrekt gesendet werden. Aber wie kann ich das machen Microsoft.Net.Http
? Vielen Dank.
c#
json
dotnet-httpclient
IlDrugo
quelle
quelle
using
für dieHttpClient
. aspnetmonsters.com/2016/08/2016-08-27-httpclientwrongusing
nicht verwendet werden sollte:HttpClient is intended to be instantiated once and reused throughout the life of an application. The following conditions can result in SocketException errors: Creating a new HttpClient instance per request. Server under heavy load. Creating a new HttpClient instance per request can exhaust the available sockets.
docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/…Antworten:
Die direkte Antwort auf Ihre Frage lautet: Nein. Die Signatur für die
PostAsync
Methode lautet wie folgt:Während Sie also ein übergeben können
object
,PostAsync
muss es vom Typ seinHttpContent
und Ihr anonymer Typ erfüllt diese Kriterien nicht.Es gibt jedoch Möglichkeiten, das zu erreichen, was Sie erreichen möchten. Zunächst müssen Sie Ihren anonymen Typ in JSON serialisieren. Das häufigste Tool hierfür ist Json.NET . Und der Code dafür ist ziemlich trivial:
Als nächstes müssen Sie ein Inhaltsobjekt erstellen, um diese Daten zu senden. Ich werde ein
ByteArrayContent
Objekt verwenden, aber Sie können einen anderen Typ verwenden oder erstellen, wenn Sie möchten.Als Nächstes möchten Sie den Inhaltstyp festlegen, damit die API weiß, dass es sich um JSON handelt.
Dann können Sie Ihre Anfrage, die Ihrem vorherigen Beispiel sehr ähnlich ist, mit dem Formularinhalt senden:
Nebenbei bemerkt kann das Aufrufen der
.Result
Eigenschaft, wie Sie es hier tun, einige schlimme Nebenwirkungen haben, wie z. B. Dead Locking. Sie sollten also vorsichtig damit sein.quelle
POST, PUT, DELETE
wird, normalerweise die API-RückgabeTRUE
, habe ich die Methode als deklariertstring
, aber wenn ich dies tue:return result;
Ich erhalte :Can't Convert HttpResponseMessage in string
, sollte ich die Methodendeklaration ändern? Ich brauche die String-Antwort, weil ich sie nach einer anderen Klassenmethode deserialisieren muss.result.Content.ReadAsStringAsync()
ist es wahrscheinlich in Ordnung , die Zeichenfolge so zurückzugeben, wie Sie es in Ihrer Frage (mit ) getan haben. Abhängig von Ihrer Anwendungsstruktur ist es möglicherweise besser, dasContent
Objekt direkt zurückzugeben, wenn Sie die Header überprüfen müssen, um festzustellen, um welchen Kongentyp es sich handelt (z. B. XML oder JSON). Wenn Sie jedoch wissen , dass JSON (oder ein anderes Format) immer zurückgegeben wird, sollte es in Ordnung sein, nur den Antworttext als Zeichenfolge zurückzugeben.StringContent
?StringContent
direkt an übergeben,PostAsync
da es von abgeleitet istHttpContent
.Sie müssen Ihre Daten im Anforderungshauptteil als Rohzeichenfolge übergeben und nicht
FormUrlEncodedContent
. Eine Möglichkeit besteht darin, es in eine JSON-Zeichenfolge zu serialisieren:Jetzt müssen Sie nur noch die Zeichenfolge an die post-Methode übergeben.
quelle
stringContent
? In meinem Fall ist derstringContent
Wert"\"\""
. Ist das der richtige Wert?Eine einfache Lösung ist die Verwendung
Microsoft ASP.NET Web API 2.2 Client
von NuGet .Dann können Sie dies einfach tun und das Objekt wird in JSON serialisiert und der
Content-Type
Header wird auf Folgendes gesetztapplication/json; charset=utf-8
:quelle
Es gibt jetzt einen einfacheren Weg mit
.NET Standard
oder.NET Core
:HINWEIS: Um die
JsonMediaTypeFormatter
Klasse verwenden zu können, müssen Sie dasMicrosoft.AspNet.WebApi.Client
NuGet-Paket installieren, das direkt oder über ein anderes wie zMicrosoft.AspNetCore.App
.Mit dieser Signatur von
HttpClient.PostAsync
können Sie jedes Objekt übergeben und dasJsonMediaTypeFormatter
kümmert sich automatisch um die Serialisierung usw.Mit der Antwort können Sie
HttpContent.ReadAsAsync<T>
den Antwortinhalt auf den erwarteten Typ deserialisieren:quelle
.NET Standard
oder verwenden.NET Core
, wie ich bereits erwähnt habe. Vielleicht benutzt du.NET Framework
? In meinem Projekt wird der JsonMediaTypeFormatter von hier geladen: C: \ Programme \ dotnet \ sdk \ NuGetFallbackFolder \ microsoft.aspnet.webapi.client \ 5.2.6 \ lib \ netstandard2.0 \ System.Net.Http.Formatting. dll