Надсилання JSON на сервер та отримання JSON у відповідь, без JQuery


115

Мені потрібно надіслати JSON (на який я можу впорядкувати) на сервер і отримати отриманий JSON на стороні користувача, не використовуючи JQuery.

Якщо я повинен використовувати GET, як мені передавати JSON як параметр? Чи існує ризик, що це буде занадто довго?

Якщо я повинен використовувати POST, як мені встановити еквівалент onloadфункції в GET?

Або я повинен використовувати інший метод?

ЗАМИСЛЕННЯ

Це питання не стосується надсилання простого AJAX. Він не повинен закриватися як дублікат.


Вам потрібно користуватися XMLHttpRequest. Незважаючи на ім'я, ви можете використовувати його для даних JSON (і саме так jQuery робить це у фоновому режимі).
elixenide

2
Я б розмістив дані. Погляньте на це: youmightnotneedjquery.com . Тут показано, як можна отримувати / розміщувати дані за допомогою ванілі JS.
HaukurHaf

1
@Ed Cottrell Посилане питання не має нічого спільного з цим. Довідка стосується (ПОВЕРНЕНО) 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 питання, що стосуються цих моментів. Очевидно, є якась різниця - рідко два питання є абсолютно однаковими - але це банально, якщо ви вже знаєте, як зробити порядок і проаналізувати JSON. Однак, оскільки ви і @ hex494D49 не погоджуєтесь, я висуваю це на повторне відкриття.
еліксинід

Відповіді:


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-залежності залежить від використовуваного сервера та клієнта (браузера) від 2 кБ - 8 кБ. Сервер повинен повернути статус 414 (Request-URI Too Long), якщо URI довший, ніж може обробити сервер.

Примітка. Хтось сказав, що я можу використовувати імена штатів замість значень стану; Іншими словами, я міг би використовуватись xhr.readyState === xhr.DONEзамість xhr.readyState === 4Проблема полягає в тому, що Internet Explorer використовує різні імена стану, тому краще використовувати значення стану.


4
Повинно бути xhr.status === 200.
qed

Я використовую той самий код, щоб розміщувати дані JSON в API REST, який розміщений o 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двічі.
Шукант Пал
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.