2010-01-20 20 views

Respuesta

28

No se puede POST información de dominio cruzado, subdominio o número de puerto. Sin embargo, puede utilizar JSONP si tiene acceso tanto al daemon como al del sitio solicitante. Si los datos deben ser devueltos, entonces el daemon necesita soportar un parámetro de consulta callback y devolverlo con el formato correcto.

pasar la información al demonio:

$.getJSON('http://domain.com:8080/url/here?callback=?', { 
    key: 'value', 
    otherKey: 'otherValue' 
}, function(data){ 
    // Handles the callback when the data returns 
}); 

Ahora acaba de asegurarse de que su demonio gestiona el parámetro callback. Por ejemplo, si callback=mycallback el retorno desde el demonio (la única cosa por escrito a la página) debería tener este aspecto:

Por un pares clave/valor:

mycallback({'returnkey':'returnvalue', 'other':'data' }); 

para una matriz:

mycallback([1,2,3]); 

Si no tiene implementado un JSONP o mecanismo similar, no puede comunicar dominios cruzados mediante jQuery.

+2

¿Hay una manera general, para reemplazar 'dominio. com'? De esta manera solo puede funcionar en producción, porque uso 'localhost' en un entorno en desarrollo. – user198729

+4

Debería poder usar ''http: //' + window.location.hostname + ': 8080/url'' para compilar la URL que funcionará localmente y en línea. –

37

Esto rompe el Same origin policy. No puede usar un puerto diferente, incluso cuando usa el mismo dominio.

Puede utilizar JSONP como Doug sugerido.

O bien, como otra solución posible, puede configurar un muy simple reverse proxy (usando mod_proxy si está en Apache). Esto le permitiría usar rutas relativas en su solicitud AJAX, mientras que el servidor HTTP actuaría como un proxy para cualquier ubicación "remota".

La directiva de configuración fundamental para configurar un proxy inverso en mod_proxy es ProxyPass. Lo más habitual es utilizar la siguiente manera:

ProxyPass  /ajax/  http://www.localhost:8080/ 

En este caso, se debe solicitar /ajax/test.xml con jQuery, pero, de hecho, el servidor podría servir a esta actuando como un proxy para http://www.localhost:8080/test.xml internamente.

Si está utilizando IIS, es posible que desee utilizar el Managed Fusion URL Rewriter and Reverse Proxy para configurar un proxy inverso.

+1

+1 Para una respuesta fantástica. Respondí la respuesta escrita de "bla, bla, bla" y proporcionaste una solución muy viable. Gracias Daniel! –

+0

Oh, el proxy provocará un procesamiento adicional en el lado del servidor. Así que elegiré jsonP – user198729

+0

. Estuve buscando todo el día intentando averiguar por qué no podía publicar datos en todos los puertos antes de encontrar esto. Gracias hombre. – screenm0nkey

2

Esto cuenta como un origen diferente, aunque lo tenga en la misma caja, solo un puerto diferente.

Si se dirige principalmente navegadores nuevos como FireFox 3.5 y superior, puede intentar agregar encabezados Access-Control a su aplicación en otro puerto y permitir la llamada desde su grupo de aplicaciones predeterminado. Información sobre los encabezados de control de acceso se puede encontrar aquí: https://developer.mozilla.org/en/HTTP_access_control

IE también lo implementa (de nuevo, en el uso de un control ActiveX diferente, ¿por qué?): http://blogs.msdn.com/ie/archive/2009/01/14/completing-access-control-support-for-xdomainrequest.aspx y http://msdn.microsoft.com/en-us/library/cc288060(VS.85).aspx

Cuestiones relacionadas