Qu'est-ce que JSONP?
La chose importante à retenir avec jsonp est qu'il ne s'agit pas réellement d'un protocole ou d'un type de données. C'est juste un moyen de charger un script à la volée et de traiter le script qui est introduit dans la page. Dans l'esprit de JSONP, cela signifie introduire un nouvel objet javascript du serveur dans l'application / script client.
Quand JSONP est-il nécessaire?
C'est une méthode permettant à un domaine d'accéder / traiter les données d'un autre dans la même page de manière asyncronale. Principalement, il est utilisé pour remplacer les restrictions CORS (Cross Origin Resource Sharing) qui se produiraient avec une requête XHR (ajax). Les chargements de scripts ne sont pas soumis aux restrictions CORS.
Comment est-il fait
L'introduction d'un nouvel objet javascript à partir du serveur peut être implémentée de plusieurs manières, mais la pratique la plus courante consiste pour le serveur à implémenter l'exécution d'une fonction de «rappel», avec l'objet requis passé. La fonction de rappel est simplement une fonction que vous avez déjà configurée sur le client et que le script que vous chargez appelle au moment où le script se charge pour traiter les données qui lui sont transmises.
Exemple:
J'ai une application qui enregistre tous les éléments dans la maison de quelqu'un. Mon application est configurée et je souhaite maintenant récupérer tous les éléments de la chambre principale.
Ma candidature est activée app.home.com
. Les API dont j'ai besoin pour charger des données sont activées api.home.com
.
À moins que le serveur ne soit explicitement configuré pour le permettre, je ne peux pas utiliser ajax pour charger ces données, car même les pages sur des sous-domaines séparés sont soumises aux restrictions XHR CORS.
Idéalement, configurez les choses pour autoriser x-domain XHR
Idéalement, comme l'API et l'application sont sur le même domaine, je pourrais avoir accès pour configurer les en-têtes api.home.com
. Si je le fais, je peux ajouter un Access-Control-Allow-Origin:
élément d'en-tête donnant accès à app.home.com
. En supposant que l'en-tête est configuré comme suit Access-Control-Allow-Origin: "http://app.home.com"
:, c'est beaucoup plus sûr que la configuration de JSONP. En effet, il app.home.com
peut obtenir tout ce dont il a api.home.com
besoin sans api.home.com
donner à CORS l'accès à tout Internet.
La solution XHR ci-dessus n'est pas possible. Configurer JSONP Sur mon script client: J'ai configuré une fonction pour traiter la réponse du serveur lorsque j'effectue l'appel JSONP. :
function processJSONPResponse(data) {
var dataFromServer = data;
}
Le serveur devra être configuré pour renvoyer un mini-script ressemblant à quelque chose comme "processJSONPResponse('{"room":"main bedroom","items":["bed","chest of drawers"]}');"
Il pourrait être conçu pour renvoyer une telle chaîne si quelque chose comme //api.home.com?getdata=room&room=main_bedroom
est appelé.
Ensuite, le client configure une balise de script en tant que telle:
var script = document.createElement('script');
script.src = '//api.home.com?getdata=room&room=main_bedroom';
document.querySelector('head').appendChild(script);
Cela charge le script et l'appelle immédiatement window.processJSONPResponse()
comme écrit / écho / imprimé par le serveur. Les données passées en paramètre à la fonction sont maintenant stockées dans la dataFromServer
variable locale et vous pouvez en faire ce dont vous avez besoin.
Nettoyer
Une fois que le client a les données, c'est à dire. immédiatement après l'ajout du script au DOM, l'élément de script peut être supprimé du DOM:
script.parentNode.removeChild(script);