JSONP

De Viquipèdia
Salta a: navegació, cerca

JSONP o JSON amb padding és una tècnica de comunicació utilitzada als programes Javascript per realitzar crides asíncrones des de dominis diferents. JSONP és un mètode concebut per superar la limitació de l'AJAX entre diferents dominis, que únicament permet realitzar peticions a pàgines que es troben sota el mateix domini i port per motius de seguretat.

Motius del JSONP[modifica | modifica el codi]

Sota la política del mateix origen (SOP), un codi Javascript carregat en un domini determinat no té permís per obtenir dades d'un altre domini. No obstant això, aquesta restricció no s'aplica a l'etiqueta <script> de HTML, per tant es pot especificar en el seu atribut src l'URL d'un script hostatjat en un servidor remot.

Com funciona[modifica | modifica el codi]

Per realitzar crides asíncrones entre diferents dominis, les dades s'obtenen carregant un script que conté l'objecte JSON. De per si mateix, això provocaria un error de sintaxi ja que el navegador estaria tractant d'interpretar JSON cru com Javascript.

<script type="text/javascript" src="http://server.example.com/data.json"></script>

Encara que el navegador interpretés l'objecte JSON com un objecte literal de Javascript, sense estar assignat a una variable no seria accessible.

{
    "api_key": "224Wrf2asfSDfcea23reSDfqW",
    "status": "good",
    "name": "wikipedia",
    "date": "27-09-1995"
}

En la tècnica de JSONP, l'objecte JSON es retorna embolcallat en la crida d'una funció. D'aquesta forma, una funció ja definida a l'entorn de Javascript pot manipular les dades JSON.

jsonCallback ({
    "api_key": "224Wrf2asfSDfcea23reSDfqW",
    "status": "good",
    "name": "wikipedia",
    "date": "27-09-1995"
});

Per convenció, el nom de la funció de tornada s'especifica mitjançant un paràmetre de la consulta, normalment, utilitzant jsonp o callback com a nom del camp en la sol·licitud al servidor.

<script type="text/javascript" src="http://server.exemple.com/data.json?callback=parseJSON"></script>

Padding[modifica | modifica el codi]

Encara que el padding és generalment el nom de la funció que embolcalla l'objecte JSON, també és possible assignar l'objecte a una variable o realitzar qualsevol altra sentència o declaració de Javascript. La petició JSONP no és JSON cru i no és analitzada com a tal, per la qual cosa es pot retornar qualsevol expressió vàlida de Javascript, i no té perquè incloure JSON.

Inserció de l'element script[modifica | modifica el codi]

L'ús de JSONP només té sentit si es vol realitzar una trucada asíncrona a un altre domini, per això és necessari manipular el DOM per inserir un element <script> en la capçalera de la pàgina, i una vegada carregat el document, no és possible escriure-hi.

function loadScript (id, src, callback) {

     // Creació element
     var script = document.createElement("script");

     // Atributs script
     script.setAttribute("type", "text/javascript");
     script.setAttribute("src", src + "?callback=" + callback);
     script.setAttribute("id", id);

     // Inserció script en la capçalera
     document.getElementsByTagName("head")[0].appendChild(script);

}

En tot cas, el més freqüent és utilitzar una biblioteca de manipulació del DOM, com ara jQuery o Mootools per tal de fer-ho.

Enllaços externs[modifica | modifica el codi]