POSTING JSON all'URL tramite WebClient in C #


89

Ho del codice JavaScript che devo convertire in C #. Il mio codice JavaScript POST di alcuni JSON a un servizio web che è stato creato. Questo codice JavaScript funziona bene e ha il seguente aspetto:

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");
}

Sto cercando di capire come convertirlo in C #. La mia app utilizza .NET 2.0. Da quello che posso dire, ho bisogno di fare qualcosa del genere:

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

Sono un po 'bloccato a questo punto. Non sono sicuro di come jsondovrebbe essere. Non sono sicuro di dover impostare il tipo di contenuto. Se lo faccio, non sono sicuro di come farlo. Ho anche visto UploadData. Quindi, non sono sicuro di usare il metodo giusto. In un certo senso, la serializzazione dei miei dati è il mio problema.

Qualcuno può dirmi cosa mi sto perdendo qui?

Grazie!

Risposte:


70

Hai bisogno di un serializzatore json per analizzare il tuo contenuto, probabilmente lo hai già, per la tua domanda iniziale su come effettuare una richiesta, questa potrebbe essere un'idea:

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();

spero che sia d'aiuto,


1
come dovrebbe essere "parsedContent"? Sfortunatamente, ho bisogno di creare manualmente il mio JSON in questo scenario. Grazie.
Eels Fan

Può sembrare solo JSON? O devo fare qualche tipo di codifica speciale è quello che sto arrivando.
Eels Fan

@EelsFan di solito non è un problema scegliere un parser JSON, puoi sempre JSON.Net per analizzare un oggetto .net in JSON, ma nella mia esperienza c'erano alcuni servizi cloud che avevano una versione del parser JSON diversa e ho dovuto crearne alcuni ritocchi. Fare ciò che è meglio per lo scenario, questa discussione potrebbe aiutare anche a vedere alcuni problemi senza Json.NET stackoverflow.com/questions/9573119/...
Jorge Alvarado

5
Perché usi ASCIIEncoding e non UTF8? Vedi stackoverflow.com/a/9254967/109392 .
timore reverenziale

2
+1 Ho provato per la prima volta in modo simile a OP usando WebCliente non l'ho fatto funzionare. Poi ho provato questa soluzione e ha funzionato a meraviglia. Stavo usando UTF8Encodinginvece di ASCIIEncodingcreare l'array di byte, perché non vedo alcun motivo per usare ASCII, che riduce i caratteri disponibili in un modo inaccettabile. ASCII ha solo 127 caratteri nel set di caratteri.
timore reverenziale

197

La domanda ha già una risposta ma credo di aver trovato la soluzione più semplice e attinente al titolo della domanda, eccola:

var cli = new WebClient();
cli.Headers[HttpRequestHeader.ContentType] = "application/json";
string response = cli.UploadString("http://some/address", "{some:\"json data\"}");

PS: Nella maggior parte delle implementazioni .net, ma non in tutte WebClient è IDisposable, quindi è meglio fare "using" o "Dispose" su di esso. Tuttavia in questo caso particolare non è realmente necessario .


1
E, per rendere il tuo json "leggibile": (in vb.net) Dim json = <JSON> {"field1": "value1", "status": "pending", "objField": {"field2": true} } </JSON> .ToString
foxontherock

Ma che dire dell'inerpolazione dei parametri in quella stringa json?
Tali B.

74

L'esempio seguente mostra come POST un JSON tramite il metodo WebClient.UploadString :

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);
}

Prerequisiti: libreria Json.NET


4
Penso che dovrebbe essere UploadStringAsync se stai usando l'evento completato.
Sam Mackrill

È possibile omettere l' POSTargomento poiché UploadStringutilizza implicitamente questo metodo come predefinito. Inoltre potresti voler aggiungere client.Headers.Add(HttpRequestHeader.Accept, "application/json");se prevedi JSONcome ritorno.
jimasun

WebClient implementa effettivamente IDisposable? Sto lavorando in .NET Framework 4.7.1 alcuni anni dopo e non lo vedo.
Bubbleking

2
@bubbleking Ho fatto clic su F12 su WebClient e vedo che si tratta di un componente e il componente implementa IDisposablepublic class WebClient : Component public class Component : MarshalByRefObject, IComponent, IDisposable
Lars Persson
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.