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


116

ฉันต้องการส่ง JSON (ซึ่งฉันสามารถสตริงได้) ไปยังเซิร์ฟเวอร์และเพื่อดึง JSON ที่เป็นผลลัพธ์ทางฝั่งผู้ใช้โดยไม่ต้องใช้ JQuery

ถ้าฉันควรใช้ GET ฉันจะส่ง JSON เป็นพารามิเตอร์ได้อย่างไร มีความเสี่ยงที่จะนานเกินไปหรือไม่?

ถ้าฉันควรใช้ POST ฉันจะตั้งค่าonloadฟังก์ชันที่เทียบเท่าใน GET ได้อย่างไร

หรือควรใช้วิธีอื่นดี?

สังเกต

คำถามนี้ไม่เกี่ยวกับการส่ง AJAX ธรรมดา ไม่ควรปิดว่าซ้ำกัน


XMLHttpRequestคุณจำเป็นต้องใช้ อย่างไรก็ตามชื่อนี้คุณสามารถใช้เป็นข้อมูล JSON ได้ (และนั่นคือวิธีที่ jQuery ทำในพื้นหลัง)
elixenide

2
ฉันจะโพสต์ข้อมูล มีลักษณะที่นี้: youmightnotneedjquery.com แสดงวิธีรับ / โพสต์ข้อมูลด้วย vanilla JS
HaukurHaf

1
@ เอ็ดคอตเทรลคำถามที่อ้างอิงไม่มีส่วนเกี่ยวข้องกับคำถามนี้ การอ้างอิงกำลังใช้ (เพียง) sendingคำขอ ajax ซึ่งเป็นสิ่งที่ค่อนข้างทั่วไป อันนี้ขอsendingแต่และreceiving JSONใน JavaScript ล้วนๆ นอกจากนี้ในการส่ง JSON นี้กลับคุณต้องรู้วิธีแก้ปัญหาในส่วนนี้server-sideซึ่งเป็นอีกสิ่งหนึ่งที่ไม่ได้กล่าวถึงในคำถามอ้างอิง
hex494D49

1
@Ed Cottrell คำถามที่คุณอ้างถึงไม่มีคำตอบที่ได้รับการอนุมัติและใช้วิธีการเก่าในการสร้างคำขอ Ajax ไม่มีคำตอบที่สมบูรณ์สำหรับคำถามนี้ คำถามของฉันละเอียดกว่า Ajax POST หรือ GET แบบเดิม คุณพลาดจุด
Jérôme Verstrynge

1
@JVerstry onreadystatechangeคือสิ่งที่คุณใช้เพื่อเลียนแบบonloadดังที่แสดงโดยคำตอบที่ยอมรับด้านล่าง สำหรับการแยกวิเคราะห์คุณเพียงแค่ใช้JSON.parse()(อีกครั้งตามที่แสดงในคำตอบ) แต่ฉันสมมติว่าคุณรู้แล้วตั้งแต่ที่คุณพูดถึงสตริงในคำถาม ฉันพยายามช่วยคุณแล้วโดยชี้ให้คุณไม่ใช่ 1 แต่ 2 คำถามที่ครอบคลุมประเด็นเหล่านี้ มีความแตกต่างอย่างเห็นได้ชัดบาง - ไม่ค่อยมี 2 คำถามว่าเหมือนกัน - แต่มันน่ารำคาญถ้าคุณรู้อยู่แล้วว่าวิธีการ stringify และ JSON แยก ที่กล่าวว่าเนื่องจากคุณและ @ hex494D49 ไม่เห็นด้วยฉันจึงเสนอสิ่งนี้เพื่อเปิดใหม่
elixenide

คำตอบ:


221

การส่งและรับข้อมูลในรูปแบบ JSON โดยใช้วิธี POST

// Sending and receiving data in JSON format using POST method
//
var xhr = new XMLHttpRequest();
var url = "url";
xhr.open("POST", url, true);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.onreadystatechange = function () {
    if (xhr.readyState === 4 && xhr.status === 200) {
        var json = JSON.parse(xhr.responseText);
        console.log(json.email + ", " + json.password);
    }
};
var data = JSON.stringify({"email": "hey@mail.com", "password": "101010"});
xhr.send(data);

การส่งและรับข้อมูลในรูปแบบ JSON โดยใช้เมธอด GET

// Sending a receiving data in JSON format using GET method
//      
var xhr = new XMLHttpRequest();
var url = "url?data=" + encodeURIComponent(JSON.stringify({"email": "hey@mail.com", "password": "101010"}));
xhr.open("GET", url, true);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.onreadystatechange = function () {
    if (xhr.readyState === 4 && xhr.status === 200) {
        var json = JSON.parse(xhr.responseText);
        console.log(json.email + ", " + json.password);
    }
};
xhr.send();

การจัดการข้อมูลในรูปแบบ JSON บนฝั่งเซิร์ฟเวอร์โดยใช้ PHP

<?php
// Handling data in JSON format on the server-side using PHP
//
header("Content-Type: application/json");
// build a PHP variable from JSON sent using POST method
$v = json_decode(stripslashes(file_get_contents("php://input")));
// build a PHP variable from JSON sent using GET method
$v = json_decode(stripslashes($_GET["data"]));
// encode the PHP variable to JSON and send it back on client-side
echo json_encode($v);
?>

ขีดจำกัดความยาวของคำขอ HTTP Get ขึ้นอยู่กับทั้งเซิร์ฟเวอร์และไคลเอนต์ (เบราว์เซอร์) ที่ใช้ตั้งแต่ 2kB - 8kB เซิร์ฟเวอร์ควรส่งคืนสถานะ 414 (Request-URI Too Long) หาก URI ยาวเกินกว่าที่เซิร์ฟเวอร์จะจัดการได้

หมายเหตุมีคนบอกว่าฉันสามารถใช้ชื่อรัฐแทนค่าของรัฐได้ กล่าวอีกนัยหนึ่งฉันสามารถใช้xhr.readyState === xhr.DONEแทนได้xhr.readyState === 4ปัญหาคือ Internet Explorer ใช้ชื่อสถานะที่แตกต่างกันดังนั้นจึงควรใช้ค่าสถานะดีกว่า


4
xhr.status === 200ควรจะเป็น
qed

ฉันใช้รหัสเดียวกันเพื่อโพสต์ข้อมูล JSON ไปยัง REST API ที่โฮสต์บน localhost แต่ได้รับข้อผิดพลาดXHR failed loading: POST
viveksinghggits

@viveksinghggits ก่อนอื่นให้ตรวจสอบว่าโค้ดจากด้านบนใช้ได้กับ localhost ของคุณหรือไม่ หากเป็นเช่นนั้น (และควรใช้งานได้) ปัญหาจะต้องอยู่ที่ฝั่งเซิร์ฟเวอร์ของคุณ ถ้าไม่เป็นเช่นนั้นแจ้งให้เราทราบแล้วฉันจะตรวจสอบ ด้วยวิธีนี้การไม่มีรหัสของคุณฉันช่วยคุณไม่ได้
hex494D49

@ hex494D49 ขอบคุณมากสำหรับการตอบกลับของคุณฉันกำลังยิง XHR ในการดำเนินการส่งของแบบฟอร์มเมื่อฉันเปลี่ยนให้ถูกยิงโดยเหตุการณ์คลิกบน ฉันได้รับข้อผิดพลาด CORS ซึ่งเป็นที่เข้าใจได้และฉันกำลังเปลี่ยนรหัสฝั่งเซิร์ฟเวอร์สำหรับสิ่งนั้น ฉันเขียนเกี่ยวกับเรื่องนี้ที่นี่medium.com/@viveksinghggits/…
viveksinghggits

6

ใช้ api ดึงใหม่:

const dataToSend = JSON.stringify({"email": "hey@mail.com", "password": "101010"});
let dataReceived=""; 
fetch("",{credentials:'same-origin',mode:'same-origin',method:"post",body:dataToSend})
              .then(resp => {
                if(resp.status==200){
                   return resp.json()
                }else{
                    console.log("Status: "+resp.status);
                    return Promise.reject("server")
                }
              })
           .then(dataJson =>{
                 dataReceived = JSON.parse(dataJson);
             })
              .catch(err =>{
                if(err=="server")return
                console.log(err);
            })
            
 console.log(`Received: ${dataReceived}`)                
คุณต้องจัดการเมื่อเซิร์ฟเวอร์ส่งสถานะอื่นมากกว่า 200 (ตกลง) คุณควรปฏิเสธผลลัพธ์นั้นเพราะถ้าคุณปล่อยให้ว่างมันจะพยายามแยกวิเคราะห์ json แต่ไม่มีดังนั้นมันจะทำให้เกิดข้อผิดพลาด


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