POSTEN von JSON an eine URL über WebClient in C #

86

Ich habe JavaScript-Code, den ich in C # konvertieren muss. Mein JavaScript-Code sendet einige JSON-Dateien an einen erstellten Webdienst. Dieser JavaScript-Code funktioniert einwandfrei und sieht folgendermaßen aus:

var vm = { k: "1", a: "2", c: "3", v: "4" };
$.ajax({
  url: "http://www.mysite.com/1.0/service/action",
  type: "POST",
  data: JSON.stringify(vm),
  contentType: "application/json;charset=utf-8",
  success: action_Succeeded,
  error: action_Failed
});

function action_Succeeded(r) {
  console.log(r);
}

function log_Failed(r1, r2, r3) {
  alert("fail");
}

Ich versuche herauszufinden, wie man dies in C # konvertiert. Meine App verwendet .NET 2.0. Soweit ich das beurteilen kann, muss ich Folgendes tun:

using (WebClient client = new WebClient())
{
  string json = "?";
  client.UploadString("http://www.mysite.com/1.0/service/action", json);
}

Ich stecke an diesem Punkt ein wenig fest. Ich bin mir nicht sicher, wie jsones aussehen soll. Ich bin nicht sicher, ob ich den Inhaltstyp festlegen muss. Wenn ich das tue, bin ich mir nicht sicher, wie ich das machen soll. Ich habe auch gesehen UploadData. Ich bin mir also nicht sicher, ob ich überhaupt die richtige Methode verwende. In gewissem Sinne ist die Serialisierung meiner Daten mein Problem.

Kann mir jemand sagen, was ich hier vermisse?

Danke dir!

Aal Fan
quelle

Antworten:

69

Sie benötigen einen JSON-Serializer, um Ihren Inhalt zu analysieren. Wahrscheinlich haben Sie ihn bereits. Für Ihre erste Frage, wie Sie eine Anfrage stellen können, könnte dies eine Idee sein:

var baseAddress = "http://www.example.com/1.0/service/action";

var http = (HttpWebRequest)WebRequest.Create(new Uri(baseAddress));
http.Accept = "application/json";
http.ContentType = "application/json";
http.Method = "POST";

string parsedContent = <<PUT HERE YOUR JSON PARSED CONTENT>>;
ASCIIEncoding encoding = new ASCIIEncoding();
Byte[] bytes = encoding.GetBytes(parsedContent);

Stream newStream = http.GetRequestStream();
newStream.Write(bytes, 0, bytes.Length);
newStream.Close();

var response = http.GetResponse();

var stream = response.GetResponseStream();
var sr = new StreamReader(stream);
var content = sr.ReadToEnd();

ich hoffe es hilft,

Jorge Alvarado
quelle
1
Wie soll "parsedContent" aussehen? Leider muss ich in diesem Szenario meinen JSON manuell erstellen. Danke dir.
Aals Fan
Kann es nur wie JSON aussehen? Oder muss ich eine spezielle Codierung durchführen?
Aals Fan
@EelsFan ist normalerweise kein Problem bei der Auswahl eines JSON-Parsers. Sie können jederzeit JSON.Net verwenden, um ein .net-Objekt in JSON zu analysieren. Nach meiner Erfahrung gab es jedoch einige Cloud-Dienste mit einer anderen JSON-Parser-Version, und ich musste einige erstellen Optimierungen. Tun Sie, was für Ihr Szenario am besten ist. Diese Diskussion kann Ihnen auch dabei helfen, einige Probleme ohne JSON.Net stackoverflow.com/questions/9573119/… zu erkennen.
Jorge Alvarado
5
Warum verwenden Sie ASCIIEncoding und nicht UTF8? Siehe stackoverflow.com/a/9254967/109392 .
Ehrfurcht
2
+1 Ich habe es zuerst ähnlich wie OP WebClientversucht und es nicht zum Laufen gebracht. Dann habe ich diese Lösung ausprobiert und sie hat wie ein Zauber funktioniert. Ich habe UTF8Encodingstatt verwendet ASCIIEncoding, um das Byte-Array zu erstellen, da ich keinen Grund sehe, ASCII zu verwenden, wodurch die verfügbaren Zeichen auf eine inakzeptable Weise reduziert werden. ASCII enthält nur 127 Zeichen im Zeichensatz.
Ehrfurcht
188

Die Frage ist bereits beantwortet, aber ich denke, ich habe die Lösung gefunden, die einfacher und relevanter für den Fragentitel ist. Hier ist sie:

var cli = new WebClient();
cli.Headers[HttpRequestHeader.ContentType] = "application/json";
string response = cli.UploadString("http://some/address", "{some:\"json data\"}");
sarh
quelle
1
Und um Ihren JSON "lesbar" zu machen: (in vb.net) Dim json = <JSON> {"Feld1": "Wert1", "Status": "ausstehend", "objField": {"Feld2": wahr} } </ JSON> .ToString
Foxontherock
Aber was ist mit der Inerpolation von Parametern in diesen JSON-String?
Tali B.
71

Das folgende Beispiel zeigt, wie Sie einen JSON über die WebClient.UploadString-Methode POSTEN :

var vm = new { k = "1", a = "2", c = "3", v=  "4" };
using (var client = new WebClient())
{
   var dataString = JsonConvert.SerializeObject(vm);
   client.Headers.Add(HttpRequestHeader.ContentType, "application/json");
   client.UploadString(new Uri("http://www.contoso.com/1.0/service/action"), "POST", dataString);
}

Voraussetzungen: Json.NET-Bibliothek

Vadim Gremyachev
quelle
4
Ich denke, das sollte UploadStringAsync sein, wenn Sie das abgeschlossene Ereignis verwenden.
Sam Mackrill
Sie können das POSTArgument weglassen , da UploadStringdiese Methode implizit als Standard verwendet wird. Darüber hinaus möchten Sie möglicherweise hinzufügen, client.Headers.Add(HttpRequestHeader.Accept, "application/json");wenn Sie JSONals Rendite erwarten .
Jimasun
Implementiert WebClient tatsächlich IDisposable? Ich arbeite einige Jahre später in .NET Framework 4.7.1 und sehe es nicht.
Bubbleking
2
@bubbleking Ich habe auf WebClient auf F12 geklickt und festgestellt, dass es sich um eine Komponente handelt und die Komponente IDisposable implementiertpublic class WebClient : Component public class Component : MarshalByRefObject, IComponent, IDisposable
Lars Persson