Cross Site XMLHttpRequest từ JavaScript có thể thực hiện được không?Có thể sử dụng XMLHttpRequest trên các Tên miền
Tôi hiểu những hạn chế và lý do tại sao nó không phải là thường có thể làm việc, nhưng như của firefox 3.5 có là
Access-Control-Allow-Origin: *
mà là vụ phải cho phép này để làm việc.
Nó cho trình duyệt biết rằng máy chủ không quan tâm nếu yêu cầu được gửi tới nó từ một miền không phục vụ trang.
Mã tôi đang sử dụng ở bên dưới.
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);
}
này đang gửi các tiêu đề yêu cầu đúng
YÊU CẦU
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
và nhận được phản ứng tiêu đề dự kiến
ỨNG PHÓ
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
Như bạn có thể thấy Orgin được chỉ định trong yêu cầu và máy chủ phản hồi với việc chấp nhận bất kỳ miền ("*") nào.
Tại sao tôi bị "Cấm 403" vì tôi cảm thấy rằng mọi thứ tôi đã làm là chính xác, tôi không thể giải thích tại sao?
Có ai khác nhận được thông báo này không?
Bạn có biết nguyên nhân gây ra nó không?
trình duyệt, không phải tất cả các trình duyệt hỗ trợ CORS – Raynos
Và đối với IE bạn cần sử dụng XDomainRequest thay cho XMLHTTPRequest.Nhưng vâng, cross XHR hoạt động rất tốt, tôi sử dụng nó để gửi dữ liệu đến imgur từ trang web của tôi chẳng hạn. Tôi khuyên bạn nên sử dụng một thư viện để trừu tượng hóa các chi tiết khó chịu. –
Dường như vấn đề máy chủ hơn là vấn đề về JS/trình duyệt. Kiểm tra mã APS của bạn đang xử lý yêu cầu OPTIONS một cách chính xác. – Gerben