Mengirim JSON ke server dan mengambil JSON sebagai gantinya, tanpa JQuery

115

Saya perlu mengirim JSON (yang dapat saya rangkai) ke server dan mengambil JSON yang dihasilkan di sisi pengguna, tanpa menggunakan JQuery.

Jika saya harus menggunakan GET, bagaimana cara mengirimkan JSON sebagai parameter? Apakah ada risiko terlalu lama?

Jika saya harus menggunakan POST, bagaimana cara menyetel ekuivalen dari suatu onloadfungsi di GET?

Atau haruskah saya menggunakan metode lain?

UCAPAN

Pertanyaan ini bukan tentang mengirim AJAX sederhana. Ini tidak boleh ditutup sebagai duplikat.

Jérôme Verstrynge
sumber
Anda perlu menggunakan XMLHttpRequest. Terlepas dari namanya, Anda dapat menggunakannya untuk data JSON (dan begitulah sebenarnya cara jQuery melakukannya di latar belakang).
elixenide
2
Saya akan POST datanya. Lihat ini: youmightnotneedjquery.com . Ini menunjukkan bagaimana Anda bisa mendapatkan / memposting data dengan vanilla JS.
HaukurHaf
1
@Ed Cottrell Pertanyaan yang direferensikan tidak ada hubungannya dengan pertanyaan ini. Referensi mengambil tentang (HANYA) sendingpermintaan ajax, yang merupakan hal yang cukup umum. Yang ini meminta sendingtetapi dan receiving JSONdalam JavaScript murni. Selain itu, untuk mengirim kembali JSON ini, Anda harus tahu cara menyelesaikan bagian masalah ini server-sideyang merupakan hal lain yang tidak disebutkan dalam pertanyaan yang dirujuk.
hex494D49
1
@Ed Cottrell Pertanyaan yang Anda rujuk tidak memiliki jawaban yang disetujui dan menggunakan metode lama untuk membuat permintaan Ajax. Itu tidak memberikan jawaban lengkap untuk pertanyaan ini. Pertanyaan saya lebih halus daripada Ajax POST atau GET tradisional. Anda melewatkan intinya.
Jérôme Verstrynge
1
@JVerstry onreadystatechangeadalah apa yang Anda gunakan untuk meniru onload, seperti yang ditunjukkan oleh jawaban yang diterima di bawah ini. Untuk penguraian, Anda cukup menggunakan JSON.parse()(sekali lagi, seperti yang ditunjukkan dalam jawaban), tetapi saya berasumsi bahwa Anda sudah tahu itu karena Anda menyebutkan merangkai dalam pertanyaan. Saya telah mencoba membantu Anda dengan menunjukkan bukan 1 tetapi 2 pertanyaan yang mencakup poin-poin ini. Jelas ada beberapa perbedaan - jarang ada 2 pertanyaan yang persis sama - tetapi itu sepele jika Anda sudah tahu cara merangkai dan mengurai JSON. Meskipun demikian, karena Anda dan @ hex494D49 tidak setuju, saya menominasikan ini untuk dibuka kembali.
elixenide

Jawaban:

221

Mengirim dan menerima data dalam format JSON menggunakan metode 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": "[email protected]", "password": "101010"});
xhr.send(data);

Mengirim dan menerima data dalam format JSON menggunakan metode GET

// Sending a receiving data in JSON format using GET method
//      
var xhr = new XMLHttpRequest();
var url = "url?data=" + encodeURIComponent(JSON.stringify({"email": "[email protected]", "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();

Menangani data dalam format JSON di sisi server menggunakan 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);
?>

Batas panjang permintaan HTTP Get bergantung pada server dan klien (browser) yang digunakan, dari 2kB - 8kB. Server harus mengembalikan status 414 (Request-URI Too Long) jika URI lebih panjang dari yang dapat ditangani server.

Catatan Seseorang berkata bahwa saya dapat menggunakan nama negara bagian daripada nilai negara bagian; dengan kata lain saya dapat menggunakan xhr.readyState === xhr.DONEalih-alih xhr.readyState === 4Masalahnya adalah bahwa Internet Explorer menggunakan nama negara bagian yang berbeda sehingga lebih baik menggunakan nilai negara bagian.

hex494D49
sumber
4
Seharusnya xhr.status === 200.
qed
Saya menggunakan kode yang sama untuk memposting data JSON ke REST API yang dihosting oleh localhost tetapi mendapatkan kesalahanXHR failed loading: POST
viveksinghggits
@viveksinghggits Pertama, periksa apakah kode dari atas berfungsi di host lokal Anda. Jika ya (dan seharusnya berhasil) maka masalahnya pasti ada di suatu tempat di sisi server Anda; jika tidak, beri tahu saya dan saya akan memeriksanya. Dengan cara ini, karena tidak memiliki kode apa pun, saya tidak dapat membantu Anda.
hex494D49
@ hex494D49 sangat berterima kasih atas tanggapan Anda, saya sebenarnya menembakkan XHR pada tindakan kirim formulir, ketika saya mengubahnya menjadi diaktifkan oleh peristiwa klik pada. Saya mendapat kesalahan CORS, itu bisa dimengerti dan saya mengubah kode sisi server saya untuk itu. Aku menulis tentang itu di sini medium.com/@viveksinghggits/...
viveksinghggits
6

Menggunakan pengambilan api baru :

const dataToSend = JSON.stringify({"email": "[email protected]", "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}`)                
Anda perlu menangani ketika server mengirim status lain daripada 200 (ok), Anda harus menolak hasil itu karena jika Anda membiarkannya kosong, itu akan mencoba mengurai json tetapi tidak ada, jadi itu akan menimbulkan kesalahan

John Balvin Arias
sumber
1
Anda menggunakan JSON.stringifydua kali.
Shukant Pal