Enviar un JSON al servidor y recuperar un JSON a cambio, sin JQuery

115

Necesito enviar un JSON (que puedo secuenciar) al servidor y recuperar el JSON resultante en el lado del usuario, sin usar JQuery.

Si debo usar un GET, ¿cómo paso el JSON como parámetro? ¿Existe el riesgo de que sea demasiado largo?

Si debo usar un POST, ¿cómo configuro el equivalente de una onloadfunción en GET?

¿O debería usar un método diferente?

OBSERVACIÓN

Esta pregunta no se trata de enviar un AJAX simple. No debe cerrarse como duplicado.

Jérôme Verstrynge
fuente
Necesitas usar XMLHttpRequest. Independientemente del nombre, puede usarlo para datos JSON (y así es como jQuery lo hace en segundo plano).
elixenide
2
PUBLICARÍA los datos. Eche un vistazo a esto: youmightnotneedjquery.com . Muestra cómo puede obtener / publicar datos con vanilla JS.
HaukurHaf
1
@Ed Cottrell La pregunta mencionada no tiene nada que ver con esta. La referencia se refiere a (JUSTO) sendinguna solicitud ajax, que es algo bastante general. Este está pidiendo sendingpero y receiving JSONen JavaScript puro. Además, para devolver este JSON, debe saber cómo resolver esta parte del problema, server-sideque es otra cosa que no se menciona en la pregunta de referencia.
hex494D49
1
@Ed Cottrell La pregunta a la que se refirió no tiene una respuesta aprobada y utiliza métodos antiguos para crear la solicitud Ajax. No proporciona una respuesta completa a esta pregunta. Mi pregunta es más sutil que un POST o GET de Ajax tradicional. Perdiste el punto.
Jérôme Verstrynge
1
@JVerstry onreadystatechangees lo que usa para emular onload, como se muestra en la respuesta aceptada a continuación. Para analizar, solo usa JSON.parse()(nuevamente, como se muestra en la respuesta), pero suponía que ya lo sabía desde que mencionó la cadena en la pregunta. He tratado de ayudarlo al señalarle no 1 sino 2 preguntas que cubren estos puntos. Obviamente, hay alguna diferencia, rara vez hay 2 preguntas exactamente idénticas, pero es trivial si ya sabe cómo secuenciar y analizar JSON. Dicho esto, dado que usted y @ hex494D49 no están de acuerdo, estoy nominando esto para reabrir.
Elixenide

Respuestas:

221

Enviar y recibir datos en formato JSON mediante el método 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);

Enviar y recibir datos en formato JSON usando el método 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();

Manejo de datos en formato JSON en el lado del servidor usando 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);
?>

El límite de la longitud de una solicitud HTTP Get depende tanto del servidor como del cliente (navegador) utilizado, de 2kB a 8kB. El servidor debe devolver el estado 414 (Request-URI Too Long) si un URI es más largo de lo que el servidor puede manejar.

Nota Alguien dijo que podía usar nombres de estado en lugar de valores de estado; en otras palabras, podría usar en xhr.readyState === xhr.DONElugar de xhr.readyState === 4El problema es que Internet Explorer usa diferentes nombres de estado, por lo que es mejor usar valores de estado.

hex494D49
fuente
4
Debería ser xhr.status === 200.
qed
Estoy usando el mismo código para publicar los datos JSON en la API REST que está alojada en el localhost, pero obtengo el errorXHR failed loading: POST
viveksinghggits
@viveksinghggits Primero, verifique si el código de arriba funciona en su host local. Si es así (y debería funcionar), entonces el problema debe estar en algún lugar del lado del servidor; si no es así, avíseme y lo comprobaré. De esta manera, al no tener nada de su código, no puedo ayudarlo.
hex494D49
@ hex494D49 muy agradecido por su respuesta, en realidad estaba disparando el XHR en la acción de envío del formulario, cuando lo cambié para que se disparara mediante un evento de clic. Recibí el error CORS, eso es comprensible y estoy cambiando el código del lado del servidor para eso. Escribí sobre esto aquí medium.com/@viveksinghggits/…
viveksinghggits
6

Usando nueva api fetch :

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}`)                
Debe manejar cuando el servidor envía otro estado en lugar de 200 (ok), debe rechazar ese resultado porque si lo dejara en blanco, intentará analizar el json pero no lo hay, por lo que arrojará un error

John Balvin Arias
fuente
1
Estás usando JSON.stringifydos veces.
Shukant Pal