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?
navegadores, no todos los navegadores soportan CORS – Raynos
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. –
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