¿Puedo realizar una solicitud JSONP entre dominios en JavaScript sin usar jQuery u otra biblioteca externa? Me gustaría usar JavaScript y luego analizar los datos y convertirlos en un objeto para poder usarlo. ¿Tengo que usar una biblioteca externa? Si no es así, ¿cómo puedo hacerlo?
javascript
jsonp
Dave
fuente
fuente
Respuestas:
fuente
foo(payload_of_json_data)
la idea es que cuando se carga en la etiqueta del script, llama a la función foo con la carga útil ya como un objeto javascript y no es necesario analizar.Ejemplo ligero (con soporte para onSuccess y onTimeout). Debe pasar el nombre de devolución de llamada dentro de la URL si lo necesita.
Uso de muestra:
En GitHub: https://github.com/sobstel/jsonp.js/blob/master/jsonp.js
fuente
¿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 activadasapi.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 unAccess-Control-Allow-Origin:
elemento de encabezado que otorgue acceso aapp.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 queapp.home.com
puede obtener todo lo que deseaapi.home.com
sinapi.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. :
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:
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 ladataFromServer
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:
fuente
SyntaxError: JSON.parse: unexpected character at line 1 column 2 of the JSON data
. Después de agregar comillas simples a los datos, todo funcionó bien, así que:"processJSONPResponse('{"room":"main bedroom","items":["bed","chest of drawers"]}');"
Tengo entendido que en realidad usas etiquetas de script con JSONP, así que ...
El primer paso es crear su función que manejará el JSON:
Asegúrese de que esta función sea accesible a nivel global.
A continuación, agregue un elemento de secuencia de comandos al DOM:
El script cargará el JavaScript que construye el proveedor de API y lo ejecutará.
fuente
eval
oparse
ni nada. Debería obtener JavaScript que el navegador pueda ejecutar, ¿verdad?la forma en que uso jsonp como a continuación:
luego use el método 'jsonp' como este:
referencia:
JavaScript XMLHttpRequest usando JsonP
http://www.w3ctech.com/topic/721 (hablar sobre la forma de uso de Promise)
fuente
Tengo una biblioteca javascript pura para hacer eso https://github.com/robertodecurnex/J50Npi/blob/master/J50Npi.js
Échele un vistazo y avíseme si necesita ayuda para usar o comprender el código.
Por cierto, tienes un ejemplo de uso simple aquí: http://robertodecurnex.github.com/J50Npi/
fuente
Muestra de uso:
fuente
window[callback] = null
permitir que la función sea recolectada como basura.Escribí una biblioteca para manejar esto, de la manera más simple posible. No es necesario que sea externo, es solo una función. A diferencia de otras opciones, este script se limpia después de sí mismo y se generaliza para realizar más solicitudes en tiempo de ejecución.
https://github.com/Fresheyeball/micro-jsonp
fuente
Encuentre el siguiente
JavaScript
ejemplo para hacer unaJSONP
llamada sin JQuery:Además, puede consultar mi
GitHub
repositorio como referencia.https://github.com/shedagemayur/JavaScriptCode/tree/master/jsonp
fuente
fuente
window.document.getElementsByTagName('script')[0];
y nodocument.body.appendChild(…)
?logAPI
debería establecerse ennull
cuando se hace para que se pueda realizar la recolección de basura?Si está utilizando ES6 con NPM, puede probar el módulo de nodo "fetch-jsonp". Fetch API Brinda soporte para realizar una llamada JsonP como una llamada XHR normal.
Requisito previo: debería utilizar el
isomorphic-fetch
módulo de nodo en su pila.fuente
Simplemente pegando una versión ES6 de la buena respuesta de sobstel:
fuente