Envoi d'un JSON au serveur et récupération d'un JSON en retour, sans JQuery

115

J'ai besoin d'envoyer un JSON (que je peux stringify) au serveur et de récupérer le JSON résultant côté utilisateur, sans utiliser JQuery.

Si je dois utiliser un GET, comment puis-je transmettre le JSON en tant que paramètre? Y a-t-il un risque que ce soit trop long?

Si je dois utiliser un POST, comment définir l'équivalent d'une onloadfonction dans GET?

Ou devrais-je utiliser une méthode différente?

REMARQUE

Cette question ne concerne pas l'envoi d'un simple AJAX. Il ne doit pas être fermé comme duplicata.

Jérôme Verstrynge
la source
Vous devez utiliser XMLHttpRequest. Nonobstant le nom, vous pouvez l'utiliser pour les données JSON (et c'est en fait ainsi que jQuery le fait en arrière-plan).
elixenide
2
Je publierais les données. Jetez un œil à ceci: youmightnotneedjquery.com . Il montre comment vous pouvez obtenir / publier des données avec vanilla JS.
HaukurHaf
1
@Ed Cottrell La question référencée n'a rien à voir avec celle-ci. La référence prend environ (JUST) sendingune requête ajax, ce qui est assez général. Celui-ci demande sendingmais et receiving JSONen pur JavaScript. De plus, pour renvoyer ce JSON, vous devez savoir comment résoudre cette partie du problème sur le server-sidequi est une autre chose non mentionnée sur la question référencée.
hex494D49
1
@Ed Cottrell La question à laquelle vous faites référence n'a pas de réponse approuvée et utilise d'anciennes méthodes pour créer la requête Ajax. Il ne fournit pas une réponse complète à cette question. Ma question est plus subtile qu'un Ajax POST ou GET traditionnel. Vous avez manqué le point.
Jérôme Verstrynge
1
@JVerstry onreadystatechangeest ce que vous utilisez pour émuler onload, comme le montre la réponse acceptée ci-dessous. Pour l'analyse, vous utilisez simplement JSON.parse()(encore une fois, comme indiqué dans la réponse), mais je supposais que vous le saviez déjà puisque vous avez mentionné la stringification dans la question. J'ai essayé de vous aider en vous indiquant non pas 1 mais 2 questions couvrant ces points. Il y a évidemment une différence - sont rarement 2 questions exactement identiques - mais il est trivial si vous savez déjà comment stringify et parser JSON. Cela dit, puisque vous et @ hex494D49 n'êtes pas d'accord, je propose cette proposition pour la réouverture.
elixenide

Réponses:

221

Envoi et réception de données au format JSON à l'aide de la méthode 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);

Envoi et réception de données au format JSON à l'aide de la méthode 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();

Gestion des données au format JSON côté serveur avec 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);
?>

La limite de longueur d'une requête HTTP Get dépend à la fois du serveur et du client (navigateur) utilisés, de 2 Ko à 8 Ko. Le serveur doit renvoyer l'état 414 (Request-URI Too Long) si un URI est plus long que ce que le serveur peut gérer.

Remarque Quelqu'un a dit que je pourrais utiliser des noms d'état au lieu de valeurs d'état; en d'autres termes, je pourrais utiliser xhr.readyState === xhr.DONEau lieu de xhr.readyState === 4Le problème est qu'Internet Explorer utilise des noms d'état différents, il est donc préférable d'utiliser des valeurs d'état.

hex494D49
la source
4
Devrait être xhr.status === 200.
qed
J'utilise le même code pour publier les données JSON sur l'API REST qui est hébergée sur l'hôte local mais XHR failed loading: POST
j'obtiens
@viveksinghggits Tout d'abord, vérifiez si le code ci-dessus fonctionne sur votre hôte local. Si c'est le cas (et cela devrait fonctionner), le problème doit se trouver quelque part sur votre serveur; si ce n'est pas le cas, faites-le moi savoir et je vérifierai. De cette façon, n'ayant rien de votre code, je ne peux pas vous aider.
hex494D49
@ hex494D49 tellement reconnaissant pour votre réponse, je tirais en fait le XHR sur l'action d'envoi du formulaire, lorsque je l'ai changé pour qu'il soit déclenché par un événement de clic sur. J'ai eu l'erreur CORS, c'est compréhensible et je change mon code côté serveur pour cela. J'ai écrit à ce sujet ici medium.com/@viveksinghggits/…
viveksinghggits
6

Utilisation de la nouvelle récupération d' API :

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}`)                
Vous devez gérer le moment où le serveur envoie un autre statut au lieu de 200 (ok), vous devez rejeter ce résultat car si vous le laissez vide, il essaiera d'analyser le json mais il n'y en a pas, donc il lancera une erreur

John Balvin Arias
la source
1
Vous utilisez JSON.stringifydeux fois.
Shukant Pal