Отправка JSON на сервер и получение JSON в ответ, без jQuery

#javascript #json #post #get #xmlhttprequest

#javascript #json #Публикация #получить #xmlhttprequest

Вопрос:

Мне нужно отправить JSON (который я могу упорядочить) на сервер и получить результирующий JSON на стороне пользователя, без использования jQuery.

Если я должен использовать GET, как мне передать JSON в качестве параметра? Есть ли риск, что это будет слишком долго?

Если я должен использовать POST, как мне установить эквивалент onload функции в GET?

Или я должен использовать другой метод?

ЗАМЕЧАНИЕ

Этот вопрос не касается отправки простого AJAX. Он не должен быть закрыт как дубликат.

Комментарии:

1. Вам нужно использовать XMLHttpRequest . Несмотря на название, вы можете использовать его для данных JSON (и это на самом деле, как jQuery делает это в фоновом режиме).

2. Я бы ОПУБЛИКОВАЛ данные. Взгляните на это: youmightnotneedjquery.com . Это показывает, как вы можете получать / отправлять данные с помощью ванильного JS.

3. @Ed Коттрелл Упомянутый вопрос не имеет никакого отношения к этому. Ссылка касается (ПРОСТО) sending запроса ajax, что является довольно общим. Этот запрашивает sending but и receiving JSON в чистом JavaScript. Кроме того, чтобы отправить этот JSON обратно, вы должны знать, как решить эту часть проблемы server-side , что является еще одной вещью, не упомянутой в указанном вопросе.

4. @Ed Коттрелл Вопрос, на который вы ссылались, не имеет утвержденного ответа и использует старые методы для создания Ajax-запроса. Он не дает полного ответа на этот вопрос. Мой вопрос более тонкий, чем традиционный Ajax POST или GET. Вы пропустили главное.

5. @JVerstry onreadystatechange — это то, что вы используете для эмуляции onload , как показано в принятом ответе ниже. Для синтаксического анализа вы просто используете JSON.parse() (опять же, как показано в ответе), но я предполагал, что вы уже знали это, поскольку вы упомянули stringifying в вопросе. Я попытался помочь вам, указав вам не 1, а 2 вопроса, охватывающих эти пункты. Очевидно, что есть некоторая разница — редко два вопроса абсолютно идентичны — но это тривиально, если вы уже знаете, как структурировать и анализировать JSON. Тем не менее, поскольку вы и @hex494D49 не согласны, я предлагаю это для повторного открытия.

Ответ №1:

Отправка и получение данных в формате 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 amp;amp; 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 amp;amp; 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-запроса зависит как от используемого сервера, так и от используемого клиента (браузера), от 2 КБ до 8 КБ. Сервер должен вернуть статус 414 (запрос-URI слишком длинный), если URI длиннее, чем сервер может обработать.

Обратите внимание, что кто-то сказал, что я могу использовать имена состояний вместо значений состояний; другими словами, я мог бы использовать xhr.readyState === xhr.DONE вместо xhr.readyState === 4 Проблема в том, что Internet Explorer использует разные имена состояний, поэтому лучше использовать значения состояний.

Комментарии:

1. Должно быть xhr.status === 200 .

2. Я использую тот же код для отправки данных JSON в REST API, который размещен на локальном хосте, но получаю ошибку XHR failed loading: POST

3. @viveksinghggits Сначала проверьте, работает ли приведенный выше код на вашем локальном хостинге. Если это произойдет (и это должно сработать), то проблема должна быть где-то на стороне вашего сервера; если это не так, дайте мне знать, и я это проверю. Таким образом, не имея ничего из вашего кода, я не могу вам помочь.

4. @hex494D49 так благодарен вам за ответ, я на самом деле запускал XHR в действии отправки формы, когда я изменил его на запуск с помощью события click on. Я получил ошибку CORS, это понятно, и я меняю свой серверный код для этого. Я писал об этом здесь medium.com/@viveksinghggits /…

Ответ №2:

Использование новой выборки api:

 const dataToSend = JSON.stringify({"email": "hey@mail.com", "password": "101010"});
let dataReceived = ""; 
fetch("", {
    credentials: "same-origin",
    mode: "same-origin",
    method: "post",
    headers: { "Content-Type": "application/json" },
    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 (ok), вы должны отклонить этот результат, потому что, если вы оставите его пустым, он попытается проанализировать json, но его нет, поэтому он выдаст ошибку

Комментарии:

1. Вы используете JSON.stringify дважды.