2011-12-15 20 views
10

Cross Site XMLHttpRequest desde JavaScript ¿se puede hacer?¿Es posible usar XMLHttpRequest en Dominios

entiendo las limitaciones y por qué no es generalmente capaz de trabajar, pero a partir de Firefox 3.5 no es el

Access-Control-Allow-Origin: *

que se supone para permitir que esto funcione.

Indica al navegador que al servidor no le importa si la solicitud se le envía desde un dominio que no sirvió para la página.

El código que estoy usando está por debajo.

function sendData(webservicePayload, callbackFunction) { 
var request = null; 
if (!window.XMLHttpRequest) { // code for IE 
    try { 
     request = new ActiveXObject('Msxml2.XMLHTTP'); 
    } catch (e) { 
     try { 
      request = new ActiveXObject('Microsoft.XMLHTTP'); 
     } catch (E) { 
      return 'Create XMLHTTP request IE'; 
     } 
    } 
} else { // code for Mozilla, etc. 
    request = new XMLHttpRequest(); 
} 
/* 
* Setup the callback function 
*/ 
request.onreadystatechange = function() { 
    if (request.readyState == 4 && request.status < 300) { 
     eval(callbackFunction); 
    } 
}; 
if (!request) { 
    nlapiLogExecution('ERROR', 'Create XMLHTTP request', 'Failed'); 
    return; 
} 
/* 
* Setup the request headers 
*/ 

request.open('POST','http://www.another.domain.co.uk/webservice.asmx', true); 
request.setRequestHeader('Man','POST http://www.another.domain.co.uk/webservice.asmx HTTP/1.1'); 
request.setRequestHeader('MessageType', 'CALL'); 
request.setRequestHeader('Content-Type', 'text/xml; charset="utf-8"'); 
request.setRequestHeader('Cache-Control', 'no-cache'); 
request.setRequestHeader("X-Requested-With", "XMLHttpRequest"); 
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 

request.setRequestHeader('SOAPAction','http://www.another.domain.co.uk/WebService/eService'); 
request.send(webservicePayload); 

}

Este es el envío de la cabecera de la solicitud correcta

SOLICITUD

OPTIONS /webservice.asmx HTTP/1.1 
Host: www.another.domain.co.uk 
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-gb,en;q=0.5 
Accept-Encoding: gzip, deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Connection: keep-alive 
Origin: https://my.domain.com 
Access-Control-Request-Method: POST 
Access-Control-Request-Headers: cache-control,content-type,man,messagetype,soapaction 
Pragma: no-cache 
Cache-Control: no-cache 

y la recepción de una cabecera de respuesta esperada

RESPUESTA

HTTP/1.1 403 Forbidden 
Server: Microsoft-IIS/5.1 
Date: Wed, 14 Dec 2011 13:43:27 GMT 
X-Powered-By: ASP.NET 
Access-Control-Allow-Origin: * 
Connection: close 
Content-Type: text/html 
Content-Length: 44 

Como puede ver, el Orgin se especifica en la solicitud y el servidor responde con la aceptación de cualquier ("*") dominio.

¿Por qué me sale "Prohibido 403" porque siento que todo lo que hice es correcto, no puedo entender por qué?

¿Alguien más está recibiendo esto?

¿Sabes qué lo está causando?

+2

navegadores, no todos los navegadores soportan CORS – Raynos

+0

Y para IE que necesitan use XDomainRequest en lugar de XMLHTTPRequest.Pero sí, el dominio cruzado XHR funciona muy bien, lo uso para enviar datos a imgur desde mi sitio, por ejemplo. Recomiendo usar una biblioteca para abstraer los detalles desagradables. –

+0

Parece más un problema de servidor que un problema de JS/navegador. Verifique el código APS que maneja correctamente una solicitud OPTIONS. – Gerben

Respuesta

3

Una solicitud CORs consiste en realidad en dos solicitudes HTTP físicas: 1) La solicitud de verificación previa, y 2) la solicitud real. La solicitud que publicó anteriormente se parece a la solicitud de verificación previa, ya que utiliza el método HTTP OPTIONS. Entonces, lo primero que debe hacer es verificar que su servidor acepte solicitudes OPTIONS (creo que esto debería funcionar, pero puede explicar por qué está recibiendo un 403).

A continuación, necesita una respuesta de verificación previa válida. La respuesta a una solicitud de verificación previa debe contener también los dos encabezados siguientes:

Access-Control-Allow-Methods: POST 
Access-Control-Allow-Headers: Origin,cache-control,content-type,man,messagetype,soapaction 

(ver cómo estas cabeceras de respuesta son un eco de la Access-Control-Solicitud-Método y cabeceras de solicitud Access-Control-Solicitud-headers) . El encabezado Access-Control-Allow-Headers debe contener cualquier encabezado de solicitud personalizado.

Una vez que el navegador recibe esta respuesta, sabe que la solicitud de verificación previa ha sido aceptada y realiza la solicitud real. En la solicitud real, sólo es necesario el siguiente encabezado:

Access-Control-Allow-Origin: * 

Usted puede aprender más acerca de las solicitudes de verificación previa y manipulando solicitudes de CORS aquí: http://www.html5rocks.com/en/tutorials/cors/

+0

Sin duda lo intentaré. No había ninguna razón por la que no debería haber funcionado y esta es una respuesta muy completa. Muchas gracias. – Javanerd

Cuestiones relacionadas