Solicitudes AJAX entre sitios

Necesito hacer una request AJAX desde un website a un service web REST alojado en otro dominio.

Aunque esto funciona muy bien en Internet Explorer, otros browseres como Mozilla y Google Chrome imponen restricciones de security mucho más estrictas, que prohíben las requestes AJAX entre sitios.

El problema es que no tengo control sobre el dominio ni sobre el server web donde está alojado el sitio. Esto significa que mi service web REST debe ejecutarse en otro lugar, y no puedo implementar ningún mecanismo de networkingirección.

Aquí está el código de JavaScript que realiza la llamada asincrónica:

var serviceUrl = "http://myservicedomain"; var payload = "<myRequest><content>Some content</content></myRequest>"; var request = new XMLHttpRequest(); request.open("POST", serviceUrl, true); // <-- This fails in Mozilla Firefox amongst other browsers request.setRequestHeader("Content-type", "text/xml"); request.send(payload); 

¿Cómo puedo tener este trabajo en otros browseres al lado de Internet Explorer?

tal vez JSONP puede ayudar.

NB tendrás que cambiar tus posts para usar json en lugar de xml

Editar

Los principales sitios como flickr y twitter admiten jsonp con devoluciones de llamadas, etc.

La publicación marcada como la respuesta es errónea: el documento de iframes NO puede acceder al padre. La misma política de origen funciona en ambos sentidos.

El hecho es que no es posible de ninguna manera consumir un service web basado en el rest usando xmlhttprequest. La única manera de cargar datos desde un dominio diferente (sin ningún marco) es usar JSONP. Cualquier otra solución requiere un proxy en el server ubicado en su propio dominio, o un proxy del lado del cliente ubicado en el dominio remoto y algún tipo de comunicación entre sitios (como easyXDM ) para comunicarse entre los documentos.

El hecho de que esto funcione en IE es un problema de security con IE, no una function.

Lamentablemente, la creación de scripts entre sitios está prohibida, y el trabajo aceptado consiste en proxy las requestes a través de su propio dominio: ¿realmente no tiene la capacidad de agregar o modificar el código del lado del server?

Además, la solución alternativa (que implica la adquisición de datos a través de tags de script) solo admitirá requestes GET, que es posible que pueda piratear con un service SOAP, pero no tanto con la request POST a un service RESTful que usted describa.

Realmente no estoy seguro de que exista una solución AJAX, es posible que haya vuelto a una solución <form>.

La solución no muy clara (pero funciona) es usar iframe como contenedor para requestes a otros sitios. El problema es que el padre no puede acceder al contenido de iframe, solo puede navegar el atributo "src" de iframe. Pero el contenido del iframe puede acceder al contenido de los padres.

Por lo tanto, si el contenido del iframe lo sabe, pueden llamar a algún contenido de JavaScript en la página principal o directamente acceder al DOM de los padres.

EDITAR: Muestra:

 function ajaxWorkaroung() { var frm = gewtElementById("myIFrame") frm.src = "http://some_other_domain" } function ajaxCallback(parameter){ // this function will be called from myIFrame's content } 

Haga que su dominio de service acepte compartir resources de origen cruzado (CORS).

Escenario típico: la mayoría de los browseres compatibles con CORS enviarán primero un encabezado OPTIONS, al cual el server debe devolver información sobre qué encabezados se aceptan. Si los encabezados satisfacen los requisitos del service para la request proporcionada (methods permitidos son GET y POST, Allowed-Origin *, etc.), el browser reenviará la request con el método apropiado (GET, POST, etc.).

Todo este punto hacia delante es el mismo que cuando usa IE, o más simplemente, si estaba publicando en el mismo dominio.

Caviots: algunos SDK de desarrollo de services (WCF en particular) intentarán procesar la request, en cuyo caso deberá preprocesar el método OPTIONS para responder a la request y evitar que se llame al método dos veces en el server.

En resumen, el problema se encuentra en el lado del server.

Editar Hay un problema con IE 9 y abajo con CORS, ya que no está completamente implementado. Afortunadamente, puede resolver este problema haciendo sus llamadas desde el código del server al service y hacer que vuelva a través de su server (por ejemplo, mypage.aspx? Service = blah & method = blahblah & p0 = firstParam = something). A partir de aquí, su código del lado del server debería implementar un model de secuencia de request / respuesta.

Solo use un proxy del lado del server en su dominio de origen. Aquí hay un ejemplo: http://jquery-howto.blogspot.com/2009/04/cross-domain-ajax-querying-with-jquery.html

Esto también se puede hacer utilizando localmente una configuration de server web que invoca curl con los arguments correctos y devuelve la salida curl.

app.rb

 require 'sinatra' require 'curb' set :views,lambda {"views/"+self.name.to_s.downcase.sub("controller","")} set :haml, :layout => :'../layout', :format => :html5, :escape_html=>true disable :raise_errors get '/data/:brand' do data_link = "https://externalsite.com/#{params[:brand]}" c = Curl::Easy.perform(data_link) c.body_str end 

Enviar una request ajax a localhost: 4567 / data / something devolverá el resultado de externalsite.com/something.

Otra opción sería configurar un logging CNAME en su propio dominio para "enmascarar" el nombre de host del dominio remoto.