¿Qué es JSONP?
Lo importante para recordar con jsonp es que en realidad no es un protocolo o tipo de datos. Es solo una forma de cargar un script sobre la marcha y procesar el script que se introduce en la página. En el espíritu de JSONP, esto significa introducir un nuevo objeto javascript desde el servidor en la aplicación / script del cliente.
¿Cuándo se necesita JSONP?
Es un método para permitir que un dominio acceda / procese datos de otro en la misma página de forma asincrónica. Principalmente, se utiliza para anular las restricciones de CORS (intercambio de recursos de origen cruzado) que se producirían con una solicitud XHR (ajax). Las cargas de scripts no están sujetas a las restricciones de CORS.
Como se hace
La introducción de un nuevo objeto javascript desde el servidor se puede implementar de muchas maneras, pero la práctica más común es que el servidor implemente la ejecución de una función de 'devolución de llamada', con el objeto requerido pasado a ella. La función de devolución de llamada es solo una función que ya ha configurado en el cliente a la que llama el script que carga en el punto en el que carga el script para procesar los datos que se le pasan.
Ejemplo:
Tengo una aplicación que registra todos los elementos en la casa de alguien. Mi aplicación está configurada y ahora quiero recuperar todos los elementos del dormitorio principal.
Mi aplicación está encendida app.home.com
. Las apis de las que necesito cargar datos están activadas api.home.com
.
A menos que el servidor esté configurado explícitamente para permitirlo, no puedo usar ajax para cargar estos datos, ya que incluso las páginas en subdominios separados están sujetas a restricciones XHR CORS.
Idealmente, configure las cosas para permitir XHR de dominio x
Idealmente, dado que la api y la aplicación están en el mismo dominio, podría tener acceso para configurar los encabezados api.home.com
. Si lo hago, puedo agregar un Access-Control-Allow-Origin:
elemento de encabezado que otorgue acceso a app.home.com
. Suponiendo que el encabezado está configurado de la siguiente manera:, Access-Control-Allow-Origin: "http://app.home.com"
esto es mucho más seguro que configurar JSONP. Esto se debe a que app.home.com
puede obtener todo lo que desea api.home.com
sin api.home.com
dar acceso a CORS a todo Internet.
La solución XHR anterior no es posible. Configurar JSONP en mi script de cliente: configuro una función para procesar la respuesta desde el servidor cuando hago la llamada JSONP. :
function processJSONPResponse(data) {
var dataFromServer = data;
}
El servidor deberá configurarse para devolver un mini script con un aspecto similar. "processJSONPResponse('{"room":"main bedroom","items":["bed","chest of drawers"]}');"
Podría estar diseñado para devolver una cadena de este tipo si //api.home.com?getdata=room&room=main_bedroom
se llama a algo como .
Luego, el cliente configura una etiqueta de secuencia de comandos como tal:
var script = document.createElement('script');
script.src = '//api.home.com?getdata=room&room=main_bedroom';
document.querySelector('head').appendChild(script);
Esto carga el script e inmediatamente llama window.processJSONPResponse()
como escrito / echo / impreso por el servidor. Los datos pasados como parámetro a la función ahora se almacenan en la dataFromServer
variable local y puede hacer con ellos lo que necesite.
Limpiar
Una vez que el cliente tiene los datos, es decir. Inmediatamente después de que se agrega el script al DOM, el elemento del script se puede eliminar del DOM:
script.parentNode.removeChild(script);