2013-02-26 13 views
59

Mam trochę kodu JavaScript, który muszę przekonwertować na C#. Mój kod JavaScript POSTs niektóre JSON do usługi internetowej, która została utworzona. Ten kod JavaScript działa poprawnie i wygląda tak:OGŁASZAJ JSON na URL przez WebClient w 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"); 
} 

Próbuję dowiedzieć się, jak przekonwertować to do C#. Moja aplikacja korzysta z .NET 2.0. Z tego, co mogę powiedzieć, muszę zrobić coś jak następuje:

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

jestem trochę zakleszczony w tym punkcie. Nie jestem pewien, jak powinien wyglądać json. Nie jestem pewien, czy muszę ustawić typ zawartości. Jeśli tak, nie jestem pewien, jak to zrobić. Widziałem także UploadData. Więc nie jestem pewien, czy używam nawet właściwej metody. W pewnym sensie serializacja moich danych jest moim problemem.

Czy ktoś może mi powiedzieć, czego tu brakuje?

Dziękujemy!

Odpowiedz

54

Musisz serializatora json do analizowania treści, prawdopodobnie masz już go za początkowe pytanie, w jaki sposób złożyć zamówienie, to może być pomysł:

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

nadzieję, że to pomaga,

+0

co należy "parsedContent" wygląda? Niestety, w tym scenariuszu muszę ręcznie utworzyć mój JSON. Dziękuję Ci. –

+0

Czy to może wyglądać jak JSON? Czy muszę zrobić jakieś specjalne kodowanie? –

+0

@EelsFan zwykle nie ma problemu z wybieraniem dowolnego parsera JSON, zawsze możesz JSON.Net analizować obiekt .net w JSON, ale z mojego doświadczenia wynika, że ​​niektóre usługi w chmurze miały inną wersję parsera JSON i musiałem zrobić niektóre poprawki. Zrób to, co jest najlepsze dla twojego scenariusza, ta dyskusja może ci pomóc również zobaczyć pewne problemy bez JSON.Net http://stackoverflow.com/questions/9573119/how-to-parse-json-without-json-net-library –

137

pytanie jest już odpowiedź, ale myślę, że znalazłem rozwiązanie, które jest prostsze i bardziej istotne pytanie postawione w tytule, to jest tutaj:

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

I, aby dokonać json "czytelny": (w VB.NET) Dim json = { "pole1": "value1", "status" : "w toku", "objField": { "pole2": true} } .ToString – foxontherock

41

Poniższy przykład ilustruje sposób aby umieścić JSON poprzez 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); 
} 

Wymagania: Json.NET library

+2

myślę, że powinno być UploadStringAsync jeśli używasz zakończonego zdarzenia –

+0

Możesz pominąć argument 'POST', ponieważ' UploadString' domyślnie używa tej metody jako domyślnej. Ponadto możesz dodać 'cli ent.Headers.Add (HttpRequestHeader.Accept, "application/json"); 'jeśli oczekujesz' JSON' jako return. – jimasun