ĐĂNG JSON lên URL qua WebClient trong C #


87

Tôi có một số mã JavaScript cần chuyển đổi sang C #. Mã JavaScript của tôi ĐĂNG một số JSON lên 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:

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 cách chuyển đổi mã này sang C #. Ứng dụng của tôi đang sử dụng .NET 2.0. Từ những gì tôi có thể cho biết, tôi cần phải làm điều gì đó như sau:

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

Tôi hơi bế tắc ở điểm này. Tôi không chắc mình jsonsẽ trông như thế nào. Tôi không chắc liệu mình có cần đặt loại nội dung hay không. Nếu tôi làm vậy, tôi không chắc 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 mình có đang sử dụng đúng phương pháp hay không. Theo một nghĩa nào đó, việc tuần tự hóa dữ liệu là vấn đề của tôi.

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

Cảm ơn bạn!

Câu trả lời:


70

Bạn cần một bộ tuần tự json để phân tích cú pháp nội dung của mình, có thể bạn đã có nó, đối với câu hỏi ban đầu của bạn về cách đưa ra yêu cầu, đây có thể là một ý tưởng:

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

hy vọng nó giúp,


1
"parsedContent" sẽ trông như thế nào? Rất tiếc, tôi cần tạo thủ công JSON của mình trong trường hợp này. Cảm ơn bạn.
Eels Fan

Nó có thể giống như JSON không? Hay tôi cần thực hiện một số loại mã hóa đặc biệt là những gì tôi nhận được.
Eels Fan

@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 cú pháp một đối tượng .net thành JSON, nhưng theo kinh nghiệm của tôi, có một số dịch vụ đám mây có phiên bản phân tích cú pháp JSON khác và tôi phải tạo một số tinh chỉnh. Hãy làm những gì tốt nhất cho kịch bản của bạn, cuộc thảo luận này cũng có thể giúp bạn thấy một số vấn đề mà không có JSON.Net stackoverflow.com/questions/9573119/…
Jorge Alvarado

5
Tại sao bạn sử dụng ASCIIEncoding chứ không phải UTF8? Xem stackoverflow.com/a/9254967/109392 .
awe

2
+1 Lần đầu tiên tôi đã thử tương tự với OP bằng cách sử dụng WebClientvà không làm cho nó hoạt động. Sau đó, tôi đã thử cách ngâm rượu này, và nó hoạt động như một sự quyến rũ. Tôi đang sử dụng UTF8Encodingthay vì ASCIIEncodingđể tạo mảng byte, vì tôi không thấy lý do gì để sử dụng ASCII, điều này làm giảm các ký tự có sẵn theo cách không thể chấp nhận được. ASCII chỉ có 127 ký tự trong bảng mã.
awe

197

Câu hỏi đã được trả lời nhưng tôi nghĩ rằng tôi đã tìm thấy giải pháp đơn giản hơn và phù hợp hơn với tiêu đề câu hỏi, đây 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 "có thể đọc được": (trong vb.net) Dim json = <JSON> {"field1": "value1", "status": "pending", "objField": {"field2": true} } </JSON>
.ToString

Nhưng còn việc nội suy các tham số vào chuỗi json đó thì sao?
Tali B.

74

Ví dụ sau minh họa cách ĐĂNG một JSON qua Phương thức 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);
}

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


4
Tôi nghĩ rằng đó phải là UploadStringAsync nếu bạn đang sử dụng sự kiện đã hoàn thành.
Sam Mackrill

Bạn có thể bỏ qua POSTđối số như UploadStringmặc định sử dụng phương thức này. Hơn nữa, bạn có thể muốn thêm client.Headers.Add(HttpRequestHeader.Accept, "application/json");nếu bạn mong đợi JSONnhư trở lại.
jimasun

WebClient có thực sự triển khai IDisposable không? Tôi đang làm việc trong .NET Framework 4.7.1 vài năm sau và tôi không thấy nó.
bong bóng vào

2
@bubbleking Tôi đã nhấp vào F12 trên WebClient và thấy rằng đó là một Thành phần và Thành phần triển khai IDisposablepublic class WebClient : Component public class Component : MarshalByRefObject, IComponent, IDisposable
Lars Persson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.