2013-02-26 55 views
59

Tôi có một số mã JavaScript mà tôi cần chuyển đổi thành C#. Mã JavaScript của tôi POST một số JSON vào một dịch vụ web đã được tạo. Mã JavaScript này hoạt động tốt và trông giống như sau:Gửi JSON tới URL qua WebClient trong 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"); 
} 

Tôi đang cố gắng tìm ra cách chuyển đổi thành C#. Ứng dụng của tôi đang sử dụng .NET 2.0. Từ những gì tôi có thể nói, tôi cần thực hiện một số việc như sau:

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

Tôi đang gặp khó khăn vào thời điểm này. Tôi không chắc chắn những gì json sẽ giống như thế. Tôi không chắc liệu tôi có cần đặt loại nội dung không. Nếu tôi làm thế, tôi không chắc chắn làm thế nào để làm điều đó. Tôi cũng thấy UploadData. Vì vậy, tôi không chắc liệu tôi có sử dụng đúng phương pháp hay không. Theo nghĩa nào đó, việc tuần tự hóa dữ liệu của tôi là vấn đề của tôi.

Ai đó có thể cho tôi biết tôi đang thiếu gì ở đây không?

Cảm ơn bạn!

Trả lời

54

Bạn cần một serializer json để phân tích nội dung của bạn, có lẽ bạn đã có nó, cho câu hỏi ban đầu của bạn về làm thế nào để tạo ra một yêu cầu, điều này có thể là một ý tưởng:

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

hy vọng nó sẽ giúp,

+0

gì nên "parsedContent" như thế nào? Thật không may, tôi cần phải tự tạo JSON của mình trong trường hợp này. Cảm ơn bạn. –

+0

Có thể nó giống như JSON? Hoặc tôi cần phải làm một số loại mã hóa đặc biệt là những gì tôi nhận được. –

+0

@EelsFan thường không phải là vấn đề khi chọn bất kỳ trình phân tích cú pháp JSON nào, bạn luôn có thể JSON.Net phân tích đối tượng .net thành JSON, nhưng trong kinh nghiệm của tôi có một số dịch vụ đám mây có phiên bản trình phân tích cú pháp JSON khác nhau và tôi phải thực hiện một số chỉnh sửa. Làm điều tốt nhất cho kịch bản của bạn, cuộc thảo luận này có thể giúp bạn cũng thấy một số vấn đề mà không có JSON.Net http://stackoverflow.com/questions/9573119/how-to-parse-json-without-json-net-library –

137

câu hỏi đặt ra đã được trả lời nhưng tôi nghĩ rằng tôi đã tìm thấy các giải pháp mà là đơn giản và phù hợp hơn với tiêu đề câu hỏi, ở đây nó là:

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

Và, để làm cho json của bạn "dễ đọc": (trong vb.net) Dim json = { "field1": "value1", "trạng thái": "chờ xử lý", "objField": { "field2": true} } ToString – foxontherock

41

Ví dụ sau đây cho thấy làm thế nào để viết JSON qua 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); 
} 

Điều kiện tiên quyết: Json.NET library

+2

tôi nghĩ rằng nên UploadStringAsync nếu Bạn đang sử dụng sự kiện hoàn thành –

+0

Bạn có thể bỏ qua đối số 'POST' là' UploadString' ngầm sử dụng phương thức này làm mặc định. Ngoài ra, bạn có thể muốn thêm 'cli ent.Headers.Add (HttpRequestHeader.Accept, "application/json"); 'nếu bạn mong đợi' JSON' là return. – jimasun

Các vấn đề liên quan