Gửi một JSON đến máy chủ và lấy lại một JSON mà không cần JQuery


115

Tôi cần gửi JSON (mà tôi có thể xâu chuỗi) tới máy chủ và để truy xuất JSON kết quả ở phía người dùng mà không cần sử dụng JQuery.

Nếu tôi nên sử dụng GET, làm cách nào để chuyển JSON làm tham số? Có rủi ro là nó sẽ quá lâu không?

Nếu tôi nên sử dụng POST, làm cách nào để đặt hàm tương đương onloadtrong GET?

Hay tôi nên sử dụng một phương pháp khác?

NHẬN XÉT

Câu hỏi này không phải về việc gửi một AJAX đơn giản. Nó không nên được đóng lại là trùng lặp.


Bạn cần sử dụng XMLHttpRequest. Mặc dù vậy, bạn có thể sử dụng tên này cho dữ liệu JSON (và đó thực sự là cách jQuery thực hiện nó trong nền).
elixenide

2
Tôi sẽ ĐĂNG dữ liệu. Hãy xem cái này: youmightnotneedjquery.com . Nó chỉ ra cách bạn có thể lấy / đăng dữ liệu với vanilla JS.
HaukurHaf

1
@Ed Cottrell Câu hỏi được tham chiếu không liên quan gì đến câu hỏi này. Tham chiếu đang sử dụng (JUST) sendingmột yêu cầu ajax, đây là một điều khá chung chung. Cái này yêu cầu sendingnhưng và receiving JSONbằng JavaScript thuần túy. Hơn nữa, để gửi lại JSON này, bạn phải biết cách giải quyết phần này của vấn đề server-sidemà một vấn đề khác không được đề cập trong câu hỏi tham chiếu.
hex494D49

1
@Ed Cottrell Câu hỏi bạn đã tham khảo không có câu trả lời được chấp thuận và sử dụng các phương pháp cũ để tạo yêu cầu Ajax. Nó không cung cấp câu trả lời đầy đủ cho câu hỏi này. Câu hỏi của tôi tinh tế hơn một Ajax POST hoặc GET truyền thống. Bạn đã bỏ lỡ điểm.
Jérôme Verstrynge

1
@JVerstry onreadystatechangelà những gì bạn sử dụng để mô phỏng onload, như được hiển thị trong câu trả lời được chấp nhận bên dưới. Để phân tích cú pháp, bạn chỉ cần sử dụng JSON.parse()(một lần nữa, như được hiển thị trong câu trả lời), nhưng tôi giả sử rằng bạn đã biết điều đó vì bạn đã đề cập đến việc xâu chuỗi trong câu hỏi. Tôi đã cố gắng giúp bạn bằng cách chỉ cho bạn không phải 1 mà là 2 câu hỏi liên quan đến những điểm này. Rõ ràng là có một số khác biệt - hiếm khi là 2 câu hỏi chính xác giống hệt nhau - nhưng đó là tầm thường nếu bạn đã biết làm thế nào để stringify và phân tích cú pháp JSON. Điều đó có nghĩa là, vì bạn và @ hex494D49 không đồng ý, nên tôi đề nghị mở lại.
elixenide

Câu trả lời:


221

Gửi và nhận dữ liệu ở định dạng JSON bằng phương thức 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);

Gửi và nhận dữ liệu ở định dạng JSON bằng phương thức 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();

Xử lý dữ liệu ở định dạng JSON ở phía máy chủ bằng 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);
?>

Giới hạn độ dài của một yêu cầu HTTP Get phụ thuộc vào cả máy chủ và máy khách (trình duyệt) được sử dụng, từ 2kB - 8kB. Máy chủ sẽ trả về trạng thái 414 (Yêu cầu-URI quá dài) nếu URI dài hơn máy chủ có thể xử lý.

Lưu ý Ai đó đã nói rằng tôi có thể sử dụng tên trạng thái thay vì giá trị trạng thái; nói cách khác, tôi có thể sử dụng xhr.readyState === xhr.DONEthay vì xhr.readyState === 4. Vấn đề là Internet Explorer sử dụng các tên trạng thái khác nhau nên tốt hơn là sử dụng các giá trị trạng thái.


4
Nên xhr.status === 200.
qed

Tôi đang sử dụng cùng mã để gửi dữ liệu JSON để REST API được lưu trữ o localhost nhưng nhận được lỗiXHR failed loading: POST
viveksinghggits

@viveksinghggits Trước tiên, hãy kiểm tra xem mã từ trên có hoạt động trên máy chủ cục bộ của bạn không. Nếu nó xảy ra (và nó sẽ hoạt động) thì vấn đề phải nằm ở đâu đó ở phía máy chủ của bạn; nếu nó không, hãy cho tôi biết và tôi sẽ kiểm tra nó. Bằng cách này, không có gì trong mã của bạn, tôi không thể giúp bạn.
hex494D49

@ hex494D49 rất cảm ơn bạn đã phản hồi, tôi thực sự đã kích hoạt XHR trên hành động gửi của biểu mẫu, khi tôi thay đổi nó thành kích hoạt bởi một sự kiện nhấp chuột vào. Tôi gặp lỗi CORS, điều đó có thể hiểu được và tôi đang thay đổi mã phía máy chủ của mình cho lỗi đó. Tôi đã viết về nó ở đây medium.com/@viveksinghggits/...
viveksinghggits

6

Sử dụng tìm nạp api mới :

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}`)                
Bạn cần xử lý khi máy chủ gửi trạng thái khác chứ không phải 200 (ok), bạn nên từ chối kết quả đó vì nếu bạn để trống, nó sẽ cố gắng phân tích cú pháp json nhưng không có, vì vậy nó sẽ báo lỗi


1
Bạn đang sử dụng JSON.stringifyhai lần.
Shukant Pal
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.