Utilizo este código para la llamada de ajax de dominio cruzado, espero que ayude a más de uno aquí. Estoy usando librería Prototype y se puede hacer lo mismo con jQuery o Dojo o cualquier otra cosa:
Paso 1: crear un nuevo archivo js y poner dentro de esta clase, lo llamé xss_ajax.js
var WSAjax = Class.create ({
initialize: function (_url, _callback){
this.url = _url ;
this.callback = _callback ;
this.connect() ;
},
connect: function(){
var script_id = null;
var script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src', this.url);
script.setAttribute('id', 'xss_ajax_script');
script_id = document.getElementById('xss_ajax_script');
if(script_id){
document.getElementsByTagName('head')[0].removeChild(script_id);
}
// Insert <script> into DOM
document.getElementsByTagName('head')[0].appendChild(script);
},
process: function (data){
this.callback(data) ;
}
}) ;
Esta clase crea un elemento de script dinámico que src atribuye a su proveedor de datos JSON (JSON-P, de hecho, ya que su servidor distante debe proporcionar los datos en este formato :: call_back_function (// json_data_here) :: entonces cuando se crea la etiqueta de script su JSON será evacuado directamente como una función (hablaremos sobre pasar el nombre del método de devolución de llamada al servidor en el paso 2), el concepto principal detrás de esto es que las secuencias de comandos como img no se preocupan por las restricciones de SOP.
Paso 2: En cualquier página HTML donde se quiere tirar de la JSON de forma asíncrona (llamamos a esto :-) AJAJ ~ Asynchronous JavaScript + JSON en lugar de AJAX que utilizan el objeto XHTTPRequest) hacer, como a continuación
//load Prototype first
//load the file you've created in step1
var xss_crawler = new WSAjax (
"http://your_json_data_provider_url?callback=xss_crawler.process"
, function (_data){
// your json data is _data and do whatever you like with it
}) ;
D '¿recuerdas la devolución de llamada en el paso 1? así que lo pasamos al servidor y devolverá el JSON embebido en ese método, por lo que en nuestro caso el servidor devolverá un código de JavaScript evarable xss_crawler.process (// the_json_data), recuerde que xss_crawler es una instancia de la clase WSAjax. El código del servidor depende de usted (si es suyo), pero la mayoría de los proveedores de datos de Ajax le permiten especificar el método de devolución de llamada en parámetros como lo hicimos nosotros. en Ruby on Rails que acabo de hacer
render :json=>MyModel.all(:limit=>10), :callback => params[:callback],:content_type => "application/json"
y eso es todo, ahora se puede extraer datos de otro dominio de sus aplicaciones (widgets, mapas, etc.), sólo en formato JSON, no se olvide.
espero que haya sido útil, gracias por su paciencia :-), paz y perdón por el formato de código, que no funciona bien
Y sea muy consciente de que tal proxy es un agujero de seguridad severo ... Al menos haga una lista de direcciones aceptables y no solo acepte ciegamente cualquier dirección pasada. Eche un vistazo a un script proxy decente aquí: http://benalman.com/projects/php-simple-proxy/ –
¿Pero no rompe el diseño cuando la página de destino tiene URL no absolutas y enlaces relativos? – Mori
@ChristianStuder ¿Por qué es esto problemático? – John