โพสต์ข้อมูลในรูปแบบ JSON


87

ฉันมีข้อมูลบางอย่างที่ต้องแปลงเป็นรูปแบบ JSON จากนั้นโพสต์ด้วยฟังก์ชัน JavaScript

<body onload="javascript:document.myform.submit()">
<form action="https://www.test.net/Services/RegistrationService.svc/InviteNewContact" method="post" name="myform">
  <input name="firstName" value="harry" />
  <input name="lastName" value="tester" />
  <input name="toEmail" value="testtest@test.com" />
</form>
</body>

นี่คือลักษณะของโพสต์ในขณะนี้ ฉันต้องการให้ส่งค่าในรูปแบบ JSON และทำ POST ด้วย JavaScript


ข้อมูล JSON ควรมีโครงสร้างอย่างไร เฉยๆ{"firstName":"harry", "lastName":"tester", "toEmail":"testtest@test.com"}?
Gumbo

1
ใช่ข้อมูลจะอยู่ในรูปแบบที่คุณอธิบายไว้! ขอบคุณสำหรับคำตอบ!

คำตอบ:


173

ไม่แน่ใจว่าคุณต้องการ jQuery

var form;

form.onsubmit = function (e) {
  // stop the regular form submission
  e.preventDefault();

  // collect the form data while iterating over the inputs
  var data = {};
  for (var i = 0, ii = form.length; i < ii; ++i) {
    var input = form[i];
    if (input.name) {
      data[input.name] = input.value;
    }
  }

  // construct an HTTP request
  var xhr = new XMLHttpRequest();
  xhr.open(form.method, form.action, true);
  xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');

  // send the collected data as JSON
  xhr.send(JSON.stringify(data));

  xhr.onloadend = function () {
    // done
  };
};

62
ฉันคิดว่านี่เป็นตัวอย่างที่ดีสะอาดกระชับในการทำงานให้เสร็จในโค้ด 20 บรรทัดโดยไม่ต้องใช้เฟรมเวิร์ก 100K
spidee

1
@IanKuca ขอบคุณ :) ฉันสงสัยว่าเราสามารถส่งข้อมูล json โดยไม่ต้อง urlencode ข้อมูลได้หรือไม่? ฉันหมายความว่าฉันต้องการส่งข้อมูลเช่น"cmd":"<img src=0 onerror=alert(1)>"not%3Cimg+src%3D0+onerror%3Dalert%281%29%3E
tli2020

2
@liweijian คุณควรจะได้JSON.stringifyรับผลตอบแทนอะไรก็ตาม
JK

2
@IanKuca ดูเหมือนว่าข้อมูลที่โพสต์ได้รับการเข้ารหัสโดยไม่html form JSON.stringify
tli2020

@liweijian คุณต้อง urld ถอดรหัสค่าแบบฟอร์มก่อนหากเป็นเช่นนั้น
Kevin Peno

28

นี่คือตัวอย่างการใช้jQuery ...

 <head>
   <title>Test</title>
   <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
   <script type="text/javascript" src="http://www.json.org/json2.js"></script>
   <script type="text/javascript">
     $(function() {
       var frm = $(document.myform);
       var dat = JSON.stringify(frm.serializeArray());

       alert("I am about to POST this:\n\n" + dat);

       $.post(
         frm.attr("action"),
         dat,
         function(data) {
           alert("Response: " + data);
         }
       );
     });
   </script>
</head>

ฟังก์ชันjQuery serializeArrayสร้างวัตถุ Javascript ด้วยค่าฟอร์ม จากนั้นคุณสามารถใช้JSON.stringifyเพื่อแปลงเป็นสตริงได้หากจำเป็น และคุณสามารถลบการโหลดร่างกายของคุณได้ด้วย


2
Josh ตัวอย่างใน jQuery แสดงเป็นอย่างอื่น: ดูเหมือนสตริงแบบสอบถามมาตรฐานมากกว่า JSON
Sampson

4
พวกคุณพูดถูก ฉันได้อัปเดตคำตอบตามนั้น ขอบคุณ!
Josh Stodola

7
นี่เป็นตัวอย่างที่ดีอย่างไรก็ตามตามชื่อเรื่องนี้ควรดำเนินการโดยใช้จาวาสคริปต์ไม่ใช่ไลบรารีจาวาสคริปต์ (เช่น jQuery ในกรณีนี้)
Juan Carlos Alpizar Chinchilla

4
แน่นอนคุณยินดีที่จะทำมันด้วยวิธีที่ยาก คนอื่นใช้ jQuery
PaulMurrayCbr

9
คำถามจะถามวิธีการโพสต์ข้อมูลโดยใช้จาวาสคริปต์ไม่ใช่ไลบรารี jquery สิ่งนี้ตอบคำถามผิด
Blair Anderson

3

อีกตัวอย่างมีอยู่ที่นี่:

ส่ง JSON ไปยังเซิร์ฟเวอร์และดึง JSON กลับมาโดยไม่ต้องใช้ JQuery

ซึ่งเหมือนกับ jans answer แต่ยังตรวจสอบการตอบสนองของเซิร์ฟเวอร์ด้วยการตั้งค่าการเรียกกลับ onreadystatechange บน XMLHttpRequest


2

การใช้ออบเจ็กต์FormDataใหม่(และสิ่งอื่น ๆ ของ ES6) คุณสามารถทำได้เพื่อเปลี่ยนแบบฟอร์มทั้งหมดของคุณเป็น JSON:

let data = {};
let formdata = new FormData(theform);
for (let tuple of formdata.entries()) data[tuple[0]] = tuple[1];

แล้วก็xhr.send(JSON.stringify(data));เหมือนกับคำตอบเดิมของแจน


ไม่ได้ผล ออบเจ็กต์ FormData ไม่ได้ใช้สตริงเป็น JSON อย่างเป็นประโยชน์
Quentin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.