आप समान-मूल नीति के कारण http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml
परिनियोजित फ़ाइल से एक अजाक्स कॉल करने में सक्षम नहीं होंगे ।http://run.jsbin.com
स्रोत (उर्फ उत्पत्ति ) पृष्ठ और लक्ष्य URL विभिन्न डोमेन ( run.jsbin.com
और www.ecb.europa.eu
) पर हैं, आपका कोड वास्तव में एक क्रॉस-डोमेन (CORS) अनुरोध करने का प्रयास कर रहा है , न कि एक सामान्य GET
।
कुछ शब्दों में, समान-मूल नीति कहती है कि ब्राउज़र को केवल HTML पृष्ठ के समान डोमेन पर सेवाओं के लिए अजाक्स कॉल की अनुमति देनी चाहिए ।
उदाहरण:
एक पेज http://www.example.com/myPage.html
केवल सेवाओं पर सीधे अनुरोध कर सकता है http://www.example.com
, जैसे कि http://www.example.com/api/myService
। यदि सेवा को किसी अन्य डोमेन (कहते हैं http://www.ok.com/api/myService
) पर होस्ट किया जाता है , तो ब्राउज़र सीधे कॉल नहीं करेगा (जैसा कि आप उम्मीद करेंगे)। इसके बजाय, यह एक CORS अनुरोध करने का प्रयास करेगा।
इसे शीघ्र ही डालने के लिए, अलग-अलग डोमेन में, अपने ब्राउज़र में (कोर) अनुरोध * करने के लिए:
Origin
मूल अनुरोध में एक हेडर शामिल होगा (मूल्य के रूप में पृष्ठ के डोमेन के साथ) और इसे हमेशा की तरह निष्पादित करें; और फिर
- यदि केवल उस अनुरोध के लिए सर्वर प्रतिक्रिया में पर्याप्त हेडर होते हैं ( उनमें
Access-Control-Allow-Origin
से एक है ) कॉर्स अनुरोध की अनुमति देता है, तो ब्राउज़ कॉल को पूरा करेगा (लगभग उसी तरह अगर यह HTML पेज एक ही डोमेन पर था)।
- यदि अपेक्षित हेडर नहीं आते हैं, तो ब्राउज़र बस छोड़ देता है (जैसे कि यह आपने किया था)।
* ऊपर एक सरल अनुरोध में चरणों को दर्शाया गया है , जैसे GET
कोई फैंसी हेडर के साथ नियमित रूप से। अनुरोध सरल नहीं है (जैसे एक POST
साथ application/json
सामग्री प्रकार के रूप में), ब्राउज़र यह एक पल का आयोजन करेगा, और, यह पूरा करने से पहले, पहले एक भेज देंगे OPTIONS
लक्ष्य यूआरएल के लिए अनुरोध। ऊपर की तरह, यह केवल तभी जारी रहेगा जब इस OPTIONS
अनुरोध की प्रतिक्रिया में कॉर्स हेडर शामिल हैं। यहOPTIONS
कॉल को प्रीफ़लाइट अनुरोध के रूप में जाना जाता है ।
** मैं लगभग कह रहा हूं क्योंकि नियमित कॉल और कॉर्स कॉल के बीच अन्य अंतर हैं। एक महत्वपूर्ण यह है कि कुछ हेडर, भले ही प्रतिक्रिया में मौजूद हों, अगर वेAccess-Control-Expose-Headers
हेडर में शामिल नहीं हैं, तो उन्हें ब्राउज़र द्वारा नहीं उठाया जाएगा ।
इसे कैसे जोड़ेंगे?
क्या यह सिर्फ एक टाइपो था? कभी-कभी जावास्क्रिप्ट कोड लक्ष्य डोमेन में सिर्फ एक टाइपो होता है। आपने जाँच कर ली है क्या? यदि पृष्ठ इस पर www.example.com
है तो केवल नियमित कॉल करेगा www.example.com
! जैसे अन्य यूआरएल, api.example.com
या यहाँ तक कि example.com
या www.example.com:8080
माना जाता है अलग ब्राउज़र द्वारा डोमेन! हाँ, यदि पोर्ट अलग है, तो यह एक अलग डोमेन है!
हेडर जोड़ें। कॉर्स को सक्षम करने का सबसे सरल तरीका Access-Control-Allow-Origin
सर्वर की प्रतिक्रियाओं में आवश्यक हेडर (जैसे ) जोड़कर है । (प्रत्येक सर्वर / भाषा के पास ऐसा करने का एक तरीका है - कुछ समाधान यहां देखें )
अखिरी सहारा: यदि आपके पास सेवा के लिए सर्वर-साइड एक्सेस नहीं है, तो आप इसे मिरर भी कर सकते हैं (टूल जैसे कि रिवर्स प्रॉक्सीज़ के माध्यम से ), और वहां सभी आवश्यक हेडर शामिल करें।