No olvides que en las ciencias cualquier problema casi siempre tiene varias resoluciones, no obstante nosotros te compartimos lo más óptimo y eficiente.
Solución:
Prefacio:
Esta respuesta tiene más de seis años. Si bien los conceptos y la aplicación de JSONP no han cambiado (es decir, los detalles de la respuesta aún son válidos), debe buscar usar CORS siempre que sea posible (es decir, su servidor o API lo admite, y el soporte del navegador es adecuado), como JSONP tiene riesgos de seguridad inherentes.
JSONP (JSON con relleno) es un método comúnmente utilizado para eludir las políticas entre dominios en los navegadores web. (No puede realizar solicitudes AJAX a una página web que el navegador perciba como un servidor diferente).
JSON y JSONP se comportan de manera diferente en el cliente y el servidor. Las solicitudes JSONP no se envían utilizando el XMLHTTPRequest
y los métodos de navegador asociados. en cambio un tag is created, whose source is set to the target URL. This script tag is then added to the DOM (normally inside the
element).
JSON Request:
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function ()
if (xhr.readyState == 4 && xhr.status == 200)
// success
;
;
xhr.open("GET", "somewhere.php", true);
xhr.send();
JSONP Request:
var tag = document.createElement("script");
tag.src = 'somewhere_else.php?callback=foo';
document.getElementsByTagName("head")[0].appendChild(tag);
The difference between a JSON response and a JSONP response is that the JSONP response object is passed as an argument to a callback function.
JSON:
"bar": "baz"
JSONP:
foo( "bar": "baz" );
This is why you see JSONP requests containing the callback
parameter, so that the server knows the name of the function to wrap the response.
This function must exist in the global scope at the time the el navegador evalúa la etiqueta (una vez que se ha completado la solicitud).
Otra diferencia a tener en cuenta entre el manejo de una respuesta JSON y una respuesta JSONP es que cualquier error de análisis en una respuesta JSON podría detectarse envolviendo el intento de evaluar el texto de respuesta en una declaración de prueba/captura. Debido a la naturaleza de una respuesta JSONP, los errores de análisis en la respuesta provocarán un error de análisis de JavaScript que no se puede detectar.
Ambos formatos pueden implementar errores de tiempo de espera al establecer un tiempo de espera antes de iniciar la solicitud y borrar el tiempo de espera en el controlador de respuesta.
Usando jQuery
La utilidad de usar jQuery para realizar solicitudes JSONP es que jQuery no todo el trabajo para ti en el fondo.
Por defecto, jQuery requiere que incluyas &callback=?
en la URL de su solicitud AJAX. jQuery tomará el success
función que especifique, asígnele un nombre único y publíquelo en el ámbito global. Luego reemplazará el signo de interrogación. ?
en &callback=?
con el nombre que le ha asignado.
Implementaciones JSON/JSONP comparables
Lo siguiente asume un objeto de respuesta. "bar" : "baz"
JSON:
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function ()
if (xhr.readyState == 4 && xhr.status == 200)
document.getElementById("output").innerHTML = eval('(' + this.responseText + ')').bar;
;
;
xhr.open("GET", "somewhere.php", true);
xhr.send();
JSONP:
function foo(response)
document.getElementById("output").innerHTML = response.bar;
;
var tag = document.createElement("script");
tag.src = 'somewhere_else.php?callback=foo';
document.getElementsByTagName("head")[0].appendChild(tag);
Digamos que tenía alguna URL que le dio datos JSON como:
'field': 'value'
... y tenía una URL similar, excepto que usaba JSONP, a la que pasó el nombre de la función de devolución de llamada 'myCallback' (generalmente se hace dándole un parámetro de consulta llamado 'devolución de llamada', por ejemplo http://example.com/dataSource?callback=myCallback
). Entonces volvería:
myCallback('field':'value')
... que no es solo un objeto, sino un código que se puede ejecutar. Entonces, si define una función en otra parte de su página llamada myFunction
y ejecuta este script, se llamará con los datos de la URL.
Lo bueno de esto es que puede crear una etiqueta de secuencia de comandos y usar su URL (completa con callback
parámetro) como el src
attribute, y el navegador lo ejecutará. Eso significa que puede eludir la política de seguridad del 'mismo origen' (porque los navegadores le permiten ejecutar etiquetas de secuencias de comandos de fuentes distintas al dominio de la página).
Esto es lo que hace jQuery cuando realiza una solicitud ajax (usando .ajax
con 'jsonp' como el valor para el dataType
propiedad). P.ej
$.ajax(
url: 'http://example.com/datasource',
dataType: 'jsonp',
success: function(data)
// your code to handle data here
);
Aquí, jQuery se encarga del nombre de la función de devolución de llamada y el parámetro de consulta, lo que hace que la API sea idéntica a otras llamadas ajax. Pero a diferencia de otros tipos de solicitudes ajax, como se mencionó, no está restringido a obtener datos del mismo origen que su página.
JSONP es una forma de eludir la política del mismo origen del navegador. ¿Cómo? Me gusta esto:
El objetivo aquí es hacer una solicitud a otherdomain.com
y alert
el nombre en la respuesta. Normalmente haríamos una solicitud AJAX:
$.get('otherdomain.com', function (response)
var name = response.name;
alert(name);
);
Sin embargo, dado que la solicitud se envía a un dominio diferente, no funcionará.
Podemos realizar la solicitud a través de un tag though. Both
y
$.get('otherdomain.com')
dará lugar a que se realice la misma solicitud:
GET otherdomain.com
P: Pero si usamos el tag, how could we access the response? We need to access it if we want to
alert
it.
A: Uh, we can't. But here's what we could do - define a function that uses the response, and then tell the server to respond with JavaScript that calls our function with the response as its argument.
Q: But what if the server won't do this for us, and is only willing to return JSON to us?
A: Then we won't be able to use it. JSONP requires the server to cooperate.
Q: Having to use a la etiqueta es fea.
R: Las bibliotecas como jQuery lo hacen más agradable. Ex:
$.ajax(
url: "http://otherdomain.com",
jsonp: "callback",
dataType: "jsonp",
success: function( response )
console.log( response );
);
Funciona creando dinámicamente el tag DOM element.
Q: Las etiquetas solo realizan solicitudes GET. ¿Qué sucede si queremos realizar una solicitud POST?
R: Entonces JSONP no funcionará para nosotros.
P: Está bien, solo quiero hacer una solicitud GET. JSONP es increíble y voy a usarlo, ¡gracias!
R: En realidad, no es tan increíble. Realmente es solo un truco. Y no es lo más seguro de usar. Ahora que CORS está disponible, debe usarlo siempre que sea posible.
Reseñas y valoraciones
Si posees algún titubeo y capacidad de medrar nuestro sección puedes ejecutar una interpretación y con gusto lo observaremos.