JSONP es realmente un simple truco para superar la misma política de dominio XMLHttpRequest . (Como sabe, uno no puede enviar la solicitud AJAX (XMLHttpRequest) a un dominio diferente).
Entonces, en lugar de usar XMLHttpRequest , tenemos que usar etiquetas HTMLl de script , las que usualmente usas para cargar archivos JS, para que JS obtenga datos de otro dominio. ¿Suena raro?
La cosa es que resulta que las etiquetas de script se pueden usar de manera similar a XMLHttpRequest . Mira esto:
script = document.createElement("script");
script.type = "text/javascript";
script.src = "http://www.someWebApiServer.com/some-data";
Terminará con un segmento de script que se ve así después de cargar los datos:
<script>
{['some string 1', 'some data', 'whatever data']}
</script>
Sin embargo, esto es un poco incómodo, porque tenemos que buscar esta matriz desde la etiqueta del script . Entonces, los creadores de JSONP decidieron que esto funcionará mejor (y lo es):
script = document.createElement("script");
script.type = "text/javascript";
script.src = "http://www.someWebApiServer.com/some-data?callback=my_callback";
¿ Notan la función my_callback allí? Entonces, cuando el servidor JSONP recibe su solicitud y encuentra el parámetro de devolución de llamada, en lugar de devolver una matriz JS simple, devolverá esto:
my_callback({['some string 1', 'some data', 'whatever data']});
Vea dónde está el beneficio: ahora obtenemos una devolución de llamada automática ( my_callback ) que se activará una vez que obtengamos los datos. Eso es todo lo que hay que saber sobre JSONP : es una devolución de llamada y etiquetas de script.
NOTA:
Estos son ejemplos simples del uso de JSONP, estos no son scripts listos para producción.
Demostración de JavaScript RAW (feed de Twitter simple usando JSONP):
<html>
<head>
</head>
<body>
<div id = 'twitterFeed'></div>
<script>
function myCallback(dataWeGotViaJsonp){
var text = '';
var len = dataWeGotViaJsonp.length;
for(var i=0;i<len;i++){
twitterEntry = dataWeGotViaJsonp[i];
text += '<p><img src = "' + twitterEntry.user.profile_image_url_https +'"/>' + twitterEntry['text'] + '</p>'
}
document.getElementById('twitterFeed').innerHTML = text;
}
</script>
<script type="text/javascript" src="http://twitter.com/status/user_timeline/padraicb.json?count=10&callback=myCallback"></script>
</body>
</html>
Ejemplo básico de jQuery (feed de Twitter simple usando JSONP):
<html>
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script>
$(document).ready(function(){
$.ajax({
url: 'http://twitter.com/status/user_timeline/padraicb.json?count=10',
dataType: 'jsonp',
success: function(dataWeGotViaJsonp){
var text = '';
var len = dataWeGotViaJsonp.length;
for(var i=0;i<len;i++){
twitterEntry = dataWeGotViaJsonp[i];
text += '<p><img src = "' + twitterEntry.user.profile_image_url_https +'"/>' + twitterEntry['text'] + '</p>'
}
$('#twitterFeed').html(text);
}
});
})
</script>
</head>
<body>
<div id = 'twitterFeed'></div>
</body>
</html>
JSONP significa JSON con relleno . (técnica muy mal nombrada, ya que realmente no tiene nada que ver con lo que la mayoría de la gente pensaría como "relleno").