Cos'è JSONP?
La cosa importante da ricordare con jsonp è che in realtà non è un protocollo o un tipo di dati. È solo un modo per caricare uno script al volo ed elaborare lo script introdotto nella pagina. Nello spirito di JSONP, ciò significa introdurre un nuovo oggetto javascript dal server nell'applicazione / script client.
Quando è necessario JSONP?
È un metodo per consentire a un dominio di accedere / elaborare i dati da un altro nella stessa pagina in modo asincrono. Principalmente, viene utilizzato per ignorare le restrizioni CORS (Cross Origin Resource Sharing) che si verificherebbero con una richiesta XHR (ajax). I caricamenti degli script non sono soggetti a restrizioni CORS.
Com'è fatto
L'introduzione di un nuovo oggetto javascript dal server può essere implementata in molti modi, ma la pratica più comune è che il server implementa l'esecuzione di una funzione di 'callback', con l'oggetto richiesto passato al suo interno. La funzione di callback è solo una funzione che hai già impostato sul client che lo script che carichi chiama nel punto in cui lo script viene caricato per elaborare i dati passati ad esso.
Esempio:
Ho un'applicazione che registra tutti gli elementi nella casa di qualcuno. La mia applicazione è impostata e ora desidero recuperare tutti gli oggetti nella camera da letto principale.
La mia applicazione è attiva app.home.com
. Le API da cui devo caricare i dati sono attive api.home.com
.
A meno che il server non sia impostato esplicitamente per consentirlo, non posso utilizzare ajax per caricare questi dati, poiché anche le pagine su sottodomini separati sono soggette a restrizioni XHR CORS.
Idealmente, impostare le cose per consentire XHR x-domain
Idealmente, poiché l'API e l'app si trovano sullo stesso dominio, potrei avere accesso per configurare le intestazioni su api.home.com
. Se lo faccio, posso aggiungere un Access-Control-Allow-Origin:
elemento di intestazione che concede l'accesso a app.home.com
. Supponendo che l'intestazione sia impostata come segue Access-Control-Allow-Origin: "http://app.home.com"
:, questo è molto più sicuro dell'impostazione di JSONP. Questo perché app.home.com
può ottenere tutto ciò che vuole api.home.com
senza api.home.com
dare a CORS l'accesso a tutta Internet.
La soluzione XHR di cui sopra non è possibile. Imposta JSONP Sul mio script client: ho impostato una funzione per elaborare la risposta dal server quando effettuo la chiamata JSONP. :
function processJSONPResponse(data) {
var dataFromServer = data;
}
Il server dovrà essere impostato per restituire un mini script simile a "processJSONPResponse('{"room":"main bedroom","items":["bed","chest of drawers"]}');"
Potrebbe essere progettato per restituire una stringa di questo tipo se //api.home.com?getdata=room&room=main_bedroom
viene chiamato qualcosa di simile .
Quindi il client imposta un tag di script come tale:
var script = document.createElement('script');
script.src = '//api.home.com?getdata=room&room=main_bedroom';
document.querySelector('head').appendChild(script);
Questo carica lo script e chiama immediatamente window.processJSONPResponse()
come scritto / echo / stampato dal server. I dati passati come parametro alla funzione sono ora memorizzati nella dataFromServer
variabile locale e puoi farci tutto ciò di cui hai bisogno.
Pulire
Una volta che il cliente ha i dati, ad es. immediatamente dopo che lo script è stato aggiunto al DOM, l'elemento script può essere rimosso dal DOM:
script.parentNode.removeChild(script);