การโพสต์ JSON เป็น URL ผ่าน WebClient ใน C #


89

ฉันมีโค้ด JavaScript ที่ต้องแปลงเป็น C # โค้ด JavaScript ของฉันโพสต์ JSON ไปยังบริการเว็บที่สร้างขึ้น โค้ด JavaScript นี้ทำงานได้ดีและมีลักษณะดังต่อไปนี้:

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

ฉันกำลังพยายามหาวิธีแปลงค่านี้เป็น C # แอพของฉันใช้. NET 2.0 จากสิ่งที่ฉันบอกได้ฉันต้องทำสิ่งต่อไปนี้:

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

ฉันติดขัดเล็กน้อยที่จุดนี้ ฉันไม่แน่ใจว่าjsonควรมีลักษณะอย่างไร ฉันไม่แน่ใจว่าต้องตั้งค่าประเภทเนื้อหาหรือไม่ ถ้าฉันทำฉันไม่แน่ใจว่าจะทำอย่างไร UploadDataฉันยังเห็น เลยไม่แน่ใจว่าใช้ถูกวิธีหรือเปล่า ในแง่หนึ่งการจัดลำดับข้อมูลของฉันเป็นปัญหาของฉัน

ใครช่วยบอกทีว่าฉันขาดอะไรที่นี่?

ขอขอบคุณ!

คำตอบ:


72

คุณต้องมี json serializer เพื่อแยกวิเคราะห์เนื้อหาของคุณซึ่งอาจเป็นไปได้ว่าคุณมีอยู่แล้วสำหรับคำถามเริ่มต้นของคุณเกี่ยวกับวิธีการส่งคำขอนี่อาจเป็นแนวคิด:

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

หวังว่ามันจะช่วย


1
"parsedContent" ควรมีลักษณะอย่างไร ขออภัยฉันต้องสร้าง JSON ด้วยตนเองในสถานการณ์นี้ ขอขอบคุณ.
Eels Fan

ดูเหมือน JSON ได้หรือไม่? หรือฉันต้องทำการเข้ารหัสพิเศษบางอย่างก็คือสิ่งที่ฉันได้รับ
Eels Fan

โดยปกติแล้ว @EelsFan จะไม่มีปัญหาในการเลือกตัวแยกวิเคราะห์ JSON ใด ๆ คุณสามารถ JSON.Net เพื่อแยกวิเคราะห์วัตถุ. net เป็น JSON ได้ตลอดเวลา แต่จากประสบการณ์ของฉันมีบริการคลาวด์บางอย่างที่มีเวอร์ชันแยกวิเคราะห์ JSON ที่แตกต่างกันและฉันต้องทำบางอย่าง ปรับแต่ง ทำในสิ่งที่ดีที่สุดสำหรับสถานการณ์ของคุณการสนทนานี้อาจช่วยให้คุณเห็นปัญหาบางอย่างที่ไม่มี JSON.Net stackoverflow.com/questions/9573119/…
Jorge Alvarado

5
เหตุใดคุณจึงใช้ ASCIIEncoding ไม่ใช่ UTF8 ดูstackoverflow.com/a/9254967/109392
awe

2
+1 ครั้งแรกฉันลองคล้ายกับการใช้ OP WebClientและไม่ได้ผล จากนั้นฉันก็ลองใช้การละลายนี้และได้ผลเหมือนมีเสน่ห์ ฉันใช้UTF8EncodingแทนASCIIEncodingการสร้างอาร์เรย์ไบต์เพราะฉันไม่เห็นเหตุผลที่จะใช้ ASCII ซึ่งจะลดอักขระที่มีอยู่ในลักษณะที่ไม่สามารถยอมรับได้ ASCII มีเพียง 127 อักขระในชุดอักขระ
กลัว

197

คำถามได้รับคำตอบแล้ว แต่ฉันคิดว่าฉันพบวิธีแก้ปัญหาที่ง่ายกว่าและเกี่ยวข้องกับชื่อคำถามมากกว่าแล้วนี่คือ:

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

PS: ในการใช้งาน. net ส่วนใหญ่ แต่ไม่ใช่ทั้งหมด WebClientสามารถใช้งานได้ดังนั้นจึงเป็นการดีกว่าที่จะทำ 'โดยใช้' หรือ 'ทิ้ง' กับมัน อย่างไรก็ตามในกรณีนี้โดยเฉพาะอย่างยิ่งมันไม่จำเป็นจริงๆ


1
และเพื่อให้ json ของคุณ "อ่านได้": (ใน vb.net) Dim json = <JSON> {"field1": "value1", "status": "pending", "objField": {"field2": true} } </JSON> .ToString
foxontherock

แต่สิ่งที่เกี่ยวกับการแทรกพารามิเตอร์ลงในสตริง json นั้น?
Tali B.

74

ตัวอย่างต่อไปนี้สาธิตวิธีการโพสต์ JSON ผ่าน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);
}

สิ่งที่ต้องมีก่อน: ไลบรารี Json.NET


4
ฉันคิดว่าควรเป็น UploadStringAsync หากคุณใช้เหตุการณ์ที่เสร็จสมบูรณ์
Sam Mackrill

คุณสามารถละเว้นPOSTอาร์กิวเมนต์ได้เนื่องจากUploadStringโดยปริยายใช้วิธีนี้เป็นค่าเริ่มต้น นอกจากนี้คุณอาจต้องการเพิ่มclient.Headers.Add(HttpRequestHeader.Accept, "application/json");หากคุณคาดหวังJSONผลตอบแทน
jimasun

WebClient ใช้ IDisposable จริงหรือไม่? ฉันทำงานใน. NET Framework 4.7.1 สองสามปีต่อมาและฉันไม่เห็นมัน
ฟองสบู่

2
@bubbleking ฉันคลิก F12 บน WebClient และเห็นว่ามันเป็นส่วนประกอบและส่วนประกอบที่ใช้ IDisposablepublic class WebClient : Component public class Component : MarshalByRefObject, IComponent, IDisposable
Lars Persson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.