Uno de los principales problemas que tienen los desarrolladores web a la hora de desarrollar aplicaciones RIA con ajax, es la limitación de javascript para cumplir la política de mismo origen.
Teóricamente, debido a esta política, JavaScript no puede lazar peticiones o consumir datos entre dominios distintos. Digo teóricamente, porque esto puede conseguirse con algunas técnicas de hacking como csshttprequest.
Para no tenir que recurrir a estas técnicas existe una forma más elegante de conseguir esto y es mediante jsonp.
Básicamente se basa en una técnica en la que entran en juego tanto el frontend como el backend, en la petición/respuesta json.
El cliente envía una petición de tipo jsonp con un parámetro en la url que tendría como valor el nombre de la función que manejará la respuesta de dicha petición. En el servidor se retorna una respuesta json como valor de una variable con el Mismo nombre de dicha función.
Jquery puede trabajar con jsonp, el proceso sería el siguiente:
Javascript en el frontend con jquery
$(document).ready(function () {
$.ajax({
dataType: "jsonp",
data: "",
url: "http://example.com/json?method=?",
success: function(json){ alert(json.key); }
});
/*
Si el método que se le pasa en la url
tiene un valor "?" jquery generará
un valor aleatorio para la función que
manejará la respuesta. Esto nos evita
problemas con la cache
*/
})
Código de respuesta en backend en php
header('Content-type: text/json');
$respuesta = array('key'=>'valor');
echo $_GET['method']."(".json_encode($respuesta).")");
exit();
Esto nos permitirá trabajar con ajax entre dominios y gestionar la respuesta json a nuestro antojo.
Marzo 23rd, 2009 at 3:16 am
Una buena idea, pero si no admite peticiones con POST veo un poco exagerado usar AJAX, ya que se puede hacer una petición dinámica sencilla:
script = document.createElement(”script”);
script.src = “http://otrodominio.com/respuesta.js.php”;
document.getElementById(”body”)[0].appendChild(script);
Con este método (habría que “limpiarlo un poco”) se evita AJAX, jQuery y toda esa parafernalia ;-P Y si la respuesta es JSON, procesarla será mucho más rápido.
Soy nuevo en esto de AJAX, pero realmente pienso que la mayoría de las veces se puede sustituir por este método, si bien es cierto que hay que buscar un poco de uniformidad y mantenibilidad en el código. En breve escribiré en mi blog sobre el tema, así como el código de una pequeña librería para realizar peticiones de este estilo con una sóla línea. Saludos!
Mayo 5th, 2009 at 12:13 pm
Hola Isra,
Eso es precisamente lo que hace jquery. JsonP se engloba dentro de las funciones Ajax pero no es Ajax (no usa el objeto httprequest)… es solo un méotodo de carga asíncrona que crea la llamada al script más o menos como tu dices…
Esa limpieza es lo que te da jquery ya que de serie te permite lanzar la llamada y trabajar el callback en la misma.
Otra cosa es que no quieras cargar jquery solo para hacer jsonp, pero vamos… hoy en día quien quiere solo hacer eso ;)