mode: 'no-cors'
जादुई तरीके से काम नहीं करेंगे। वास्तव में यह चीजों को बदतर बनाता है, क्योंकि इसका एक प्रभाव ब्राउज़रों को बताने के लिए है, "सभी परिस्थितियों में प्रतिक्रिया शरीर और हेडर की सामग्री को देखने से मेरे सीमांत जावास्क्रिप्ट कोड को ब्लॉक करें।" बेशक आप लगभग ऐसा कभी नहीं चाहते हैं।
फ्रंटएंड जावास्क्रिप्ट से क्रॉस-ऑरिजिनल रिक्वेस्ट के साथ क्या होता है, रिसोर्स क्रॉस-ऑरिजिन एक्सेस करने से डिफ़ॉल्ट ब्लॉक फ्रंटेंड कोड के ब्राउजर। यदि Access-Control-Allow-Origin
प्रतिक्रिया में है, तो ब्राउज़र उस अवरुद्ध को आराम देगा और आपके कोड को प्रतिक्रिया तक पहुंचने की अनुमति देगा।
लेकिन यदि कोई साइट Access-Control-Allow-Origin
अपनी प्रतिक्रियाओं में नहीं भेजती है , तो आपका फ्रंटएंड कोड सीधे उस साइट से प्रतिक्रियाओं तक नहीं पहुंच सकता है। विशेष रूप से, आप इसे निर्दिष्ट करके ठीक नहीं कर सकते mode: 'no-cors'
(वास्तव में यह सुनिश्चित करेंगे आपका फ्रंटएंड कोड प्रतिक्रिया सामग्री तक नहीं पहुंच सकता है)।
हालाँकि, एक चीज जो काम करेगी : यदि आप एक कॉर्स प्रॉक्सी के माध्यम से अपना अनुरोध भेजते हैं , तो इस तरह:
var proxyUrl = 'https://cors-anywhere.herokuapp.com/',
targetUrl = 'http://catfacts-api.appspot.com/api/facts?number=99'
fetch(proxyUrl + targetUrl)
.then(blob => blob.json())
.then(data => {
console.table(data);
document.querySelector("pre").innerHTML = JSON.stringify(data, null, 2);
return data;
})
.catch(e => {
console.log(e);
return e;
});
<pre></pre>
नोट: यदि आप https://cors-anywhere.herokuapp.com का उपयोग करने का प्रयास करने जाते हैं, तो आप पाते हैं कि यह नीचे है , आप आसानी से हरोकू को आसानी से केवल 2-3 मिनट में 5 कमांडों के साथ अपनी तैनाती दे सकते हैं:
git clone https://github.com/Rob--W/cors-anywhere.git
cd cors-anywhere/
npm install
heroku create
git push heroku master
उन आदेशों को चलाने के बाद, आप अपने स्वयं के CORS कहीं भी सर्वर पर चल रहे हैं, जैसे, https://cryptic-headland-94862.herokuapp.com/ । तो फिर अपने अनुरोध URL को https://cors-anywhere.herokuapp.com
उपसर्ग करने के बजाय, अपने स्वयं के उदाहरण के लिए URL के बजाय उपसर्ग करें; जैसे, https://cryptic-headland-94862.herokuapp.com/https://example.com ।
मैं http://catfacts-api.appspot.com/api/facts?number=99
पोस्टमैन के माध्यम से इस समापन बिंदु को हिट कर सकता हूं
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS बताते हैं कि ऐसा क्यों है कि भले ही आप पोस्टमैन के साथ प्रतिक्रिया का उपयोग कर सकते हैं, ब्राउज़र आपको प्रतिक्रिया के साथ क्रॉस-ऑरिजनल का उपयोग करने की अनुमति नहीं देंगे। एक वेब ऐप में जावास्क्रिप्ट कोड चल रहा है जब तक कि प्रतिक्रिया में Access-Control-Allow-Origin
प्रतिक्रिया शीर्षलेख शामिल नहीं है।
http://catfacts-api.appspot.com/api/facts?number=99 का कोई Access-Control-Allow-Origin
प्रतिक्रिया शीर्षलेख नहीं है, इसलिए कोई तरीका नहीं है जिससे आपका फ्रंटएंड कोड प्रतिक्रिया क्रॉस-ऑरिजिन तक पहुँच सके।
आपके ब्राउज़र को प्रतिक्रिया ठीक मिल सकती है और आप इसे पोस्टमैन में देख सकते हैं और यहां तक कि ब्राउज़र devtools में भी- लेकिन इसका मतलब यह नहीं है कि ब्राउज़र इसे आपके कोड में उजागर कर देंगे। वे नहीं करेंगे, क्योंकि इसका कोई Access-Control-Allow-Origin
प्रतिक्रिया शीर्षक नहीं है। इसलिए आपको इसे प्राप्त करने के लिए प्रॉक्सी का उपयोग करना चाहिए।
प्रॉक्सी उस साइट के लिए अनुरोध करता है, प्रतिक्रिया प्राप्त करता है, Access-Control-Allow-Origin
प्रतिक्रिया हेडर और किसी अन्य कॉर्स हेडर को जोड़ता है , फिर उस बैक को आपके अनुरोध कोड में भेज देता है। और Access-Control-Allow-Origin
हेडर के साथ उस प्रतिक्रिया को जोड़ा गया है जो ब्राउज़र देखता है, इसलिए ब्राउज़र आपके फ्रंटएंड कोड को वास्तव में प्रतिक्रिया तक पहुंचने देता है।
इसलिए मैं अपने Fetch को एक ऑब्जेक्ट में पास करने की कोशिश कर रहा हूं, जो कि CORS को निष्क्रिय कर देगा
आप ऐसा नहीं करना चाहते हैं। स्पष्ट होने के लिए, जब आप कहते हैं कि आप "CORS को अक्षम करना चाहते हैं" तो ऐसा लगता है कि आप वास्तव में उसी मूल नीति को निष्क्रिय करना चाहते हैं । CorS वास्तव में ऐसा करने का एक तरीका है - CORS समान-मूल नीति को ढीला करने का एक तरीका है, न कि इसे प्रतिबंधित करने का तरीका।
लेकिन वैसे भी, यह सच है - आप अपने स्थानीय वातावरण में - सुरक्षा को अक्षम करने और असुरक्षित रूप से चलाने के लिए अपने ब्राउज़र रनटाइम फ़्लैग जैसी चीजें कर सकते हैं, या समान-मूल नीति के आसपास पाने के लिए स्थानीय रूप से ब्राउज़र एक्सटेंशन स्थापित कर सकते हैं, लेकिन यह सब करता है केवल स्थानीय स्तर पर आपके लिए स्थिति बदल रहा है।
इससे कोई फर्क नहीं पड़ता कि आप स्थानीय रूप से क्या बदलते हैं, आपके ऐप का उपयोग करने का प्रयास करने वाला कोई अन्य व्यक्ति अभी भी उसी मूल नीति में चलने वाला है, और ऐसा कोई तरीका नहीं है जिससे आप अपने ऐप के अन्य उपयोगकर्ताओं के लिए उसे अक्षम कर सकें।
आप संभवतः mode: 'no-cors'
कुछ सीमित मामलों को छोड़कर अभ्यास में कभी भी उपयोग नहीं करना चाहते हैं , और तब भी जब आप जानते हैं कि आप वास्तव में क्या कर रहे हैं और क्या प्रभाव हैं। ऐसा इसलिए है क्योंकि mode: 'no-cors'
ब्राउज़र के लिए वास्तव में सेटिंग क्या कहती है, "सभी परिस्थितियों में प्रतिक्रिया बॉडी और हेडर की सामग्री को देखने से मेरे सीमांत जावास्क्रिप्ट कोड को ब्लॉक करें।" ज्यादातर मामलों में यह स्पष्ट रूप से नहीं है कि आप क्या चाहते हैं।
जहां तक उन मामलों का जब आप उपयोग करने पर विचार करना चाहते हैं mode: 'no-cors'
, तो जवाब देखें कि अपारदर्शी प्रतिक्रियाओं पर क्या सीमाएं लागू होती हैं? विवरण के लिए। इसका सार यह है कि मामले हैं:
सीमित मामला है जब आप एक की सामग्री के एक और मूल से एक संसाधन बनाने के लिए JavaScript का उपयोग कर रहे में <script>
, <link rel=stylesheet>
, <img>
, <video>
, <audio>
, <object>
, <embed>
, या <iframe>
तत्व (जो संसाधनों की embedding क्योंकि काम करता है पार मूल के लोगों के लिए अनुमति दी है) - लेकिन किसी कारण से आप ऐसा नहीं करना चाहते हैं या नहीं कर सकते हैं केवल दस्तावेज़ के मार्कअप होने से तत्व के लिए संसाधन URL href
या src
विशेषता के रूप में उपयोग करें ।
जब केवल एक चीज जिसे आप किसी संसाधन के साथ करना चाहते हैं, उसे कैश करना है। के रूप में जवाब में alluded क्या सीमाओं अपारदर्शी प्रतिक्रियाओं के लिए लागू होते हैं? उस स्थिति में, जब आप सेवा कार्यकर्ता का उपयोग कर रहे हैं, जिस स्थिति में एपीआई प्रासंगिक है, वह कैश संग्रहण एपीआई है ।
लेकिन उन सीमित मामलों में भी, जागरूक होने के लिए कुछ महत्वपूर्ण आधार हैं; जवाब देखें कि अपारदर्शी प्रतिक्रियाओं पर क्या सीमाएं लागू होती हैं? विवरण के लिए।
मैंने भी ऑब्जेक्ट में पास होने की कोशिश की है { mode: 'opaque'}
कोई mode: 'opaque'
अनुरोध मोड नहीं है - opaque
इसके बजाय केवल प्रतिक्रिया की एक संपत्ति है , और ब्राउज़र ने no-cors
मोड के साथ भेजे गए अनुरोधों से प्रतिक्रियाओं पर उस अपारदर्शी संपत्ति को सेट किया है।
लेकिन संयोगवश अपारदर्शी शब्द आपके द्वारा समाप्त की गई प्रतिक्रिया की प्रकृति के बारे में एक बहुत स्पष्ट संकेत है: "अपारदर्शी" इसका मतलब है कि आप इसे नहीं देख सकते हैं।
cors-anywhere
सरल गैर-ठेस उपयोग के मामलों (यानी कुछ सार्वजनिक रूप से उपलब्ध डेटा प्राप्त करना) के लिए वर्कअराउंड से प्यार करें । यह उत्तर मेरे संदेह की पुष्टि करता है जोno-cors
सामान्य नहीं है क्योंकि इसका OpaqueResponse बहुत उपयोगी नहीं है; "बहुत सीमित मामले"; क्या कोई मुझे उदाहरण समझा सकता है जहाँno-cors
उपयोगी है?