Javascript tiene una limitación por la que no se permite hacer llamadas AJAX entre dos dominios distintos. Como todas las limitaciones se ha superado de una forma u otra.
Hoy vamos a ver como superar esta limitación mediante un proxy PHP, y en los siguientes días veremos como hacerlo con CSSHTTPrequest y con JSONP.
Bien, vamos al trapo. Para empezar tenemos que desarrollar un proxy en PHP que haga las peticiones entre dominios en el lugar de Javascript, de este modo podemos llamar desde Javascript a nuestro script ‘proxy.php’ sin salir del dominio actual.
define ('HOSTNAME', 'http://www.dominiodestino.com/');
$path = ($_POST['path']) ? $_POST['path'] : $_GET['path'];
$url = HOSTNAME.$path;
$session = curl_init($url);
if ($_POST['path'])
{
$postvars = '';
while (list($clau, $valor) = each($_POST))
{
$postvars .= $clau.'='.$valor.'&';
}
curl_setopt ($session, CURLOPT_POST, true);
curl_setopt ($session, CURLOPT_POSTFIELDS, $postvars);
}
curl_setopt($session, CURLOPT_HEADER, false);
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
$xml = curl_exec($session);
header ("content-type: text/xml");
echo $xml;
curl_close($session);
Podemos hacer peticiones AJAX a este script como si se las hiciéramos al dominio de destino, simplemente teniendo en cuenta que debemos pasar la variable path con el path del dominio de destino.
En prototype la petición sería:
new Ajax.Request("proxy.php", {
method: 'post',
parameters: "&path=index.php&text=hola",
onSuccess: function(transport){
alert(transport.responseText);
}
});
Es una solución funcional pero deja bastante que desear, puesto que no solo estamos consumiendo ancho de banda del cliente, sino que además lo estamos haciendo de nuestro servidor, por lo que las peticiones tardarán ‘el doble’ en responder.
Afortunadamente y como comentaba antes no es la única solución, por eso veremos cuales són las otras en los siguientes posts.
Tags: ajax, cross-domain, entre dominios, Java Script
Junio 16th, 2009 at 14:56
A mi me parece que, aunque es verdad que tarda un poco más, es la mejor solución ¿Por qué?
Desde el punto de vista de programador deseo proteger mi código y al mismo tiempo permitir que se use por distintos servidores.
Además, con un proxy PHP puedo crear un eficiente sistema de suscripciones. También me ahorro tener que copiar tanto código en los sitios pudiendo hacer llamadas a un repositorio de APIs personales.
Marzo 1st, 2010 at 02:18
Después de tres días peleando con flex y su fichero de politica en dominio destino crossdomain.xml, para poder acceder a un rss.xml. Llegue a esta página. Mil gracias al creador de este script.
Funcionó correctamente con una instrucción en flex
Por si alguien lo necesita.
Marzo 1st, 2010 at 08:43
Hola XemaX, actualmente existe la posiblidad de hacerlo por ejemplo gracias a la función getJSON de JQuery, sin necesidad de sobrecargar la conexión del servidor web. Te recomiendo que lo pruebes no te defraudará! Un Saludo!