2011-12-15 12 views
10

जावास्क्रिप्ट से क्रॉस साइट XMLHttpRequest यह किया जा सकता है?डोमेन पर XMLHttpRequest का उपयोग करना संभव है

मैं सीमाओं को समझते हैं और क्यों यह आम तौर पर काम करने में सक्षम नहीं है, लेकिन Firefox 3.5 के रूप में वहाँ

Access-Control-Allow-Origin: *

जो इस काम करने के लिए अनुमति देने के लिए आते है।

यह ब्राउज़र को बताता है कि सर्वर को उस डोमेन से अनुरोध भेजा जाता है जो पृष्ठ की सेवा नहीं करता है।

मैं जिस कोड का उपयोग कर रहा हूं वह नीचे है।

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); 

}

यह सही अनुरोध हेडर

अनुरोध

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 

भेजने और एक उम्मीद प्रतिक्रिया हेडर

प्रतिक्रिया

प्राप्त कर रहा है
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 

जैसा कि आप देख सकते हैं कि ऑर्गिन अनुरोध में निर्दिष्ट है और सर्वर किसी भी ("*") डोमेन की स्वीकृति के साथ प्रतिक्रिया देता है।

मुझे "निषिद्ध 403" क्यों मिल रहा है क्योंकि मुझे लगता है कि मैंने जो कुछ भी किया है वह सही है, मैं क्यों काम नहीं कर सकता?

क्या कोई और यह प्राप्त कर रहा है?

क्या आप जानते हैं कि इसका कारण क्या है?

+2

ब्राउज़र, सभी ब्राउज़रों CORS – Raynos

+0

का समर्थन नहीं और IE के लिए आप की जरूरत है:

Access-Control-Allow-Origin: * 

आप preflight अनुरोध और हैंडलिंग CORS अनुरोधों के बारे में अधिक सीख सकते हैं: वास्तविक अनुरोध पर, आप केवल निम्नलिखित हेडर की जरूरत है XMLHTTPRequest के बजाय XDomainRequest का उपयोग करें।लेकिन हां, क्रॉस डोमेन एक्सएचआर बहुत अच्छी तरह से काम करता है, उदाहरण के लिए मैं अपनी साइट से imgur को डेटा भेजने के लिए इसका उपयोग करता हूं। मैं गंदा विवरणों को दूर करने के लिए एक पुस्तकालय का उपयोग करने की सलाह देता हूं। –

+0

जेएस/ब्राउज़र समस्या की तुलना में सर्वर समस्या की तरह लगता है। आपको एपीएस कोड की जांच करें जो एक विकल्प अनुरोध सही तरीके से संभालती है। – Gerben

उत्तर

3

एक सीओआर अनुरोध में वास्तव में दो भौतिक HTTP अनुरोध होते हैं: 1) प्रीफलाइट अनुरोध, और 2) वास्तविक अनुरोध। ऊपर पोस्ट किया गया अनुरोध प्रीफलाइट अनुरोध की तरह दिखता है, क्योंकि यह HTTP विकल्प विधि का उपयोग करता है। तो सबसे पहले आपको यह करना है कि आपका सर्वर OPTIONS अनुरोध स्वीकार करता है (मुझे विश्वास है कि यह सिर्फ काम करना चाहिए, लेकिन यह समझा सकता है कि आपको 403 क्यों प्राप्त हो रहा है)।

अगला, आपको एक वैध प्रीफलाइट प्रतिक्रिया की आवश्यकता है। एक preflight अनुरोध के जवाब भी निम्न दो हेडर शामिल होना चाहिए:

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

(देखें कि कैसे ये प्रतिक्रिया हेडर पहुंच-नियंत्रण-अनुरोध-विधि और पहुंच-नियंत्रण-अनुरोध-हेडर अनुरोध हेडर की एक गूंज रहे हैं) । एक्सेस-कंट्रोल-स्वीकृति-हेडर हेडर में कोई कस्टम अनुरोध शीर्षलेख होना चाहिए।

ब्राउज़र को यह प्रतिक्रिया प्राप्त होने के बाद, यह जानता है कि प्रीफलाइट अनुरोध स्वीकार कर लिया गया है, और यह वास्तविक अनुरोध करता है। http://www.html5rocks.com/en/tutorials/cors/

+0

के लिए XDomainRequest के लिए कोड मैं निश्चित रूप से इसे आज़मा दूंगा। ऐसा कोई कारण नहीं था कि इसे क्यों काम नहीं करना चाहिए था और यह एक बहुत ही व्यापक प्रतिक्रिया है। बहुत धन्यवाद। – Javanerd