2013-02-26 9 views
59

Ho qualche codice JavaScript che ho bisogno di convertire in C#. Il mio codice JavaScript POST alcuni JSON a un servizio Web che è stato creato. Questo codice JavaScript funziona bene e si presenta come la seguente:POSTing JSON a URL tramite WebClient in C#

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 convertire questo per C#. La mia app utilizza .NET 2.0. Da quello che posso dire, ho bisogno di fare qualcosa di simile al seguente:

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

io sono un po 'bloccato a questo punto. Non sono sicuro di come dovrebbe 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 se sto usando il metodo giusto. In un certo senso, la serializzazione dei miei dati è un mio problema.

Qualcuno può dirmi cosa mi manca qui?

Grazie!

risposta

54

è necessario un serializzatore JSON per analizzare il contenuto, probabilmente è già in possesso, per la tua domanda iniziale su come fare una richiesta, questa potrebbe essere un'idea:

 var baseAddress = "http://www.mysite.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(); 

Speranza che aiuta,

+0

quello che dovrebbe "parsedContent" assomigliare? Sfortunatamente, ho bisogno di creare manualmente il mio JSON in questo scenario. Grazie. –

+0

Può sembrare solo JSON? O devo fare una sorta di codifica speciale è quello che sto ottenendo. –

+0

@EelsFan di solito non è un problema scegliere un parser JSON, puoi sempre JSON.Net analizzare un oggetto .net in JSON, ma nella mia esperienza c'erano alcuni servizi cloud che avevano una versione parser JSON diversa e dovevo fare alcune modifiche. Fai ciò che è meglio per il tuo scenario, questa discussione potrebbe aiutarti anche a vedere alcuni problemi senza JSON.Net http://stackoverflow.com/questions/9573119/how-to-parse-json-without-json-net-library –

137

la domanda è già una risposta, ma credo di aver trovato la soluzione più semplice e più rilevante per il titolo della domanda, eccolo:

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

E, per rendere il vostro json "leggibile": (in vb.net) Dim jSON = { "field1": "value1", "status": "in attesa", "objField": { "field2": true} } .ToString – foxontherock

41

L'esempio seguente mostra come inviare un JSON tramite WebClient.UploadString Method:

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: Json.NET library

+2

Penso che dovrebbe essere UploadStringAsync se stai usando l'evento completato –

+0

Puoi omettere l'argomento 'POST' dato che' UploadString' usa implicitamente questo metodo come predefinito. Inoltre potresti voler aggiungere 'cli ent.Headers.Add (HttpRequestHeader.Accept, "application/json"); 'se si aspetta' JSON' come ritorno. – jimasun