POSTING JSON ke URL melalui WebClient di C #

89

Saya memiliki beberapa kode JavaScript yang perlu saya ubah ke C #. Kode JavaScript saya mengeposkan beberapa JSON ke layanan web yang telah dibuat. Kode JavaScript ini berfungsi dengan baik dan terlihat seperti berikut:

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

Saya mencoba mencari cara untuk mengubahnya menjadi C #. Aplikasi saya menggunakan .NET 2.0. Dari apa yang bisa saya katakan, saya perlu melakukan sesuatu seperti berikut:

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

Saya sedikit terjebak pada saat ini. Saya tidak yakin jsonakan terlihat seperti apa. Saya tidak yakin apakah saya perlu menyetel tipe konten. Jika saya melakukannya, saya tidak yakin bagaimana melakukan itu. Saya juga melihat UploadData. Jadi, saya tidak yakin apakah saya menggunakan metode yang benar. Dalam arti tertentu, serialisasi data saya adalah masalah saya.

Bisakah seseorang memberi tahu saya apa yang saya lewatkan di sini?

Terima kasih!

Kipas Belut
sumber

Jawaban:

70

Anda memerlukan json serializer untuk mengurai konten Anda, mungkin Anda sudah memilikinya, untuk pertanyaan awal Anda tentang cara membuat permintaan, ini mungkin sebuah ide:

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

semoga membantu,

Jorge Alvarado
sumber
1
seperti apa tampilan "parsedContent"? Sayangnya, saya perlu membuat JSON saya secara manual dalam skenario ini. Terima kasih.
Kipas Belut
Bisakah itu terlihat seperti JSON? Atau apakah saya perlu melakukan semacam pengkodean khusus adalah apa yang saya maksud.
Kipas Belut
@EelsFan biasanya tidak masalah untuk memilih parser JSON, Anda selalu dapat JSON.Net untuk mengurai objek .net menjadi JSON, tetapi menurut pengalaman saya ada beberapa layanan cloud yang memiliki versi parser JSON yang berbeda dan saya harus membuatnya tweak. Lakukan yang terbaik untuk skenario Anda, diskusi ini mungkin membantu Anda juga melihat beberapa masalah tanpa JSON.Net stackoverflow.com/questions/9573119/…
Jorge Alvarado
5
Mengapa Anda menggunakan ASCIIEncoding, dan bukan UTF8? Lihat stackoverflow.com/a/9254967/109392 .
kagum
2
+1 Saya pertama kali mencoba mirip dengan OP menggunakan WebClient, dan tidak berhasil. Kemudian saya mencoba solusi ini, dan hasilnya luar biasa. Saya menggunakan UTF8Encodingalih-alih ASCIIEncodingmembuat array byte, karena saya tidak melihat alasan untuk menggunakan ASCII, yang mengurangi karakter yang tersedia dengan cara yang tidak dapat diterima. ASCII hanya memiliki 127 karakter di charset.
kagum
197

Pertanyaannya sudah terjawab tetapi saya rasa saya telah menemukan solusi yang lebih sederhana dan lebih relevan dengan judul pertanyaan, ini dia:

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

PS: Di sebagian besar implementasi .net, tetapi tidak di semua WebClient IDisposable, jadi tentu saja lebih baik melakukan 'using' atau 'Dispose' di atasnya. Namun dalam kasus khusus ini tidak terlalu diperlukan .

sarh
sumber
1
Dan, untuk membuat json Anda "dapat dibaca": (di vb.net) Dim json = <JSON> {"field1": "value1", "status": "pending", "objField": {"field2": true} } </JSON> .ToString
foxontherock
Tapi bagaimana dengan parameter inerpolating ke dalam string json itu?
Tali B.
74

Contoh berikut menunjukkan cara POST JSON melalui Metode 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);
}

Prasyarat: perpustakaan Json.NET

Vadim Gremyachev
sumber
4
Saya pikir itu harusnya UploadStringAsync jika Anda menggunakan acara yang sudah selesai.
Sam Mackrill
Anda bisa menghilangkan POSTargumen karena UploadStringsecara implisit menggunakan metode ini sebagai default. Selanjutnya Anda mungkin ingin menambahkan client.Headers.Add(HttpRequestHeader.Accept, "application/json");jika Anda mengharapkan JSONsebagai imbalan.
jimasun
Apakah WebClient benar-benar mengimplementasikan IDisposable? Saya bekerja di .NET Framework 4.7.1 beberapa tahun kemudian dan saya tidak melihatnya.
menggelegak
2
@bubbleking Saya mengklik F12 di WebClient dan melihat bahwa Komponen dan Komponen mengimplementasikan IDisposablepublic class WebClient : Component public class Component : MarshalByRefObject, IComponent, IDisposable
Lars Persson