Hier ist der Code, den ich verwende:
// create a request
HttpWebRequest request = (HttpWebRequest)
WebRequest.Create(url); request.KeepAlive = false;
request.ProtocolVersion = HttpVersion.Version10;
request.Method = "POST";
// turn our request string into a byte stream
byte[] postBytes = Encoding.UTF8.GetBytes(json);
// this is important - make sure you specify type this way
request.ContentType = "application/json; charset=UTF-8";
request.Accept = "application/json";
request.ContentLength = postBytes.Length;
request.CookieContainer = Cookies;
request.UserAgent = currentUserAgent;
Stream requestStream = request.GetRequestStream();
// now send it
requestStream.Write(postBytes, 0, postBytes.Length);
requestStream.Close();
// grab te response and print it out to the console along with the status code
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string result;
using (StreamReader rdr = new StreamReader(response.GetResponseStream()))
{
result = rdr.ReadToEnd();
}
return result;
Wenn ich dies ausführe, erhalte ich immer 500 interne Serverfehler.
Was mache ich falsch?
c#
json
post
httpwebrequest
Arsen Zahray
quelle
quelle
Antworten:
Ich mache es so und arbeite wie folgt:
Ich habe eine Bibliothek geschrieben, um diese Aufgabe einfacher auszuführen. Sie ist hier: https://github.com/ademargomes/JsonRequest
Ich hoffe es hilft.
quelle
Ademar-Lösung kann durch den Einsatz verbessert werden
JavaScriptSerializer
‚sSerialize
Verfahren implizite Konvertierung des Objekts zu JSON bereitzustellen.Darüber hinaus ist es möglich, die
using
Standardfunktionalität der Anweisung zu nutzen, um das explizite Aufrufen vonFlush
und zu vermeidenClose
.quelle
application/json
korrekt ist.Der
HttpClient
Typ ist eine neuere Implementierung als dasWebClient
undHttpWebRequest
.Sie können einfach die folgenden Zeilen verwenden.
Wenn Sie Ihre
HttpClient
mehr als einmal benötigen , wird empfohlen, nur eine Instanz zu erstellen und wiederzuverwenden oder die neue zu verwendenHttpClientFactory
.quelle
HttpClientFactory
. Ich habe nicht alle Antworten in der verlinkten Ausgabe gelesen, aber ich denke, es muss aktualisiert werden, da die Fabrik nicht erwähnt wird.Neben Seans Beitrag ist es nicht erforderlich, die using-Anweisungen zu verschachteln. Durch
using
den StreamWriter wird er am Ende des Blocks geleert und geschlossen, sodass die MethodenFlush()
und nicht explizit aufgerufenClose()
werden müssen:quelle
Wenn Sie asynchron anrufen müssen, verwenden Sie
quelle
postStream.Write(postData);
- und müssen je nach API möglicherweise einrequest.ContentType = "application/json";
anstelle von verwendentext/json
.Achten Sie auf den von Ihnen verwendeten Inhaltstyp:
Quellen:
RFC4627
Anderer Beitrag
quelle
Ich habe mir kürzlich eine viel einfachere Möglichkeit ausgedacht, einen JSON zu veröffentlichen, mit dem zusätzlichen Schritt, von einem Modell in meiner App zu konvertieren. Beachten Sie, dass Sie das Modell [JsonObject] für Ihren Controller erstellen müssen, um die Werte abzurufen und die Konvertierung durchzuführen.
Anfrage:
Modell:
Serverseite:
quelle
Diese Option wird nicht erwähnt:
quelle
Eine andere und saubere Möglichkeit, dies zu erreichen, ist die Verwendung von HttpClient wie folgt:
quelle
PostAsJsonAsync
seit .NET 4.5.2 nicht mehr verfügbar. Verwenden SiePostAsync
stattdessen. Mehr hierusing
Anweisung wie dieser verwendet werdenIDisposable
Schnittstelle aus einem GrundWARNUNG! Ich habe eine sehr starke Meinung zu diesem Thema.
Die vorhandenen Web-Clients von .NET sind nicht entwicklerfreundlich! WebRequest & WebClient sind erstklassige Beispiele dafür, wie man einen Entwickler frustriert. Sie sind ausführlich und kompliziert zu bearbeiten; Wenn Sie nur eine einfache Post-Anfrage in C # senden möchten. HttpClient behebt diese Probleme in gewisser Weise, ist aber immer noch unzureichend. Darüber hinaus ist die Dokumentation von Microsoft schlecht… wirklich schlecht; es sei denn, Sie möchten Seiten und Seiten mit technischem Klappentext durchsuchen.
Open Source zur Rettung. Es gibt drei ausgezeichnete kostenlose Open-Source-NuGet-Bibliotheken als Alternativen. Gott sei Dank! Diese sind alle gut unterstützt, dokumentiert und ja, einfach zu korrigieren ... super einfach zu bearbeiten.
Es gibt nicht viel zwischen ihnen, aber ich würde ServiceStack.Text die leichte Kante geben ...
Ok - wie sieht eine Post-Anfrage in JSON in ServiceStack.Text aus?
Das ist eine Codezeile. Prägnant und einfach! Vergleichen Sie die obigen Informationen mit den HTTP-Bibliotheken von .NET.
quelle
Ich habe schließlich im Synchronisierungsmodus aufgerufen, indem ich das .Result eingefügt habe
quelle
var data = Encoding.ASCII.GetBytes(json);
byte[] postBytes = Encoding.UTF8.GetBytes(json);
Verwenden Sie ASCII anstelle von UFT8
quelle