mode: 'no-cors'
sihirli bir şekilde işleri yürütmez. Aslında işleri daha da kötüleştiriyor, çünkü tarayıcılara "Ön uç JavaScript kodumun yanıt gövdesi ve başlıkların içeriğine her koşulda bakmasını engelle" demektir. Tabii ki bunu neredeyse hiç istemezsiniz.
Ön uç JavaScript'ten gelen çapraz kaynak isteklerinde olan şey, tarayıcıların varsayılan olarak ön uç kodunun kaynak çapraz kaynaklara erişmesini engellemesidir. Yanıt Access-Control-Allow-Origin
veriliyorsa, tarayıcılar bu engellemeyi rahatlatacak ve kodunuzun yanıta erişmesine izin verecektir.
Ancak bir site Access-Control-Allow-Origin
yanıtlarında hayır gönderirse , ön uç kodunuz o siteden gelen yanıtlara doğrudan erişemez. Özellikle, belirterek bunu düzeltemez mode: 'no-cors'
(edeceğiz aslında sağlamak tepki içeriğini erişemez senin ön uç kodu).
Ancak, bir şey olacaktır çalışır: Eğer aracılığıyla isteği göndermek eğer bir CORS vekil böyle:
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>
Not: https://cors-anywhere.herokuapp.com'u kullanmayı denediğinizde, çalışmadığını fark ederseniz, 5 komutla kendi proxy'nizi tam anlamıyla sadece 2-3 dakika içinde Heroku'ya kolayca dağıtabilirsiniz:
git clone https:
cd cors-anywhere/
npm install
heroku create
git push heroku master
Bu komutları çalıştırdıktan sonra, örneğin https://cryptic-headland-94862.herokuapp.com/ adresinde çalışan kendi CORS Anywhere sunucunuzla karşılaşacaksınız . Dolayısıyla, istek URL'nizin https://cors-anywhere.herokuapp.com
önüne kendi örneğinizin URL'sini eklemek yerine; ör . https://cryptic-headland-94862.herokuapp.com/https://example.com .
http://catfacts-api.appspot.com/api/facts?number=99
Postman aracılığıyla bu uç noktaya ulaşabilirim
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS , yanıta Postman ile erişebilseniz bile tarayıcıların ön uçtan çapraz kaynaklı yanıta erişmenize neden izin vermediğini açıklıyor Yanıt bir Access-Control-Allow-Origin
yanıt başlığı içermediği sürece bir web uygulamasında çalışan JavaScript kodu .
http://catfacts-api.appspot.com/api/facts?number=99Access-Control-Allow-Origin
yanıt üstbilgisine sahip değildir , bu nedenle ön uç kodunuzun yanıt çapraz kaynağına erişmesine imkan yoktur.
Tarayıcınız yanıtı alabilir ve bunu Postacı'da ve hatta tarayıcı geliştirmelerinde görebilirsiniz - ancak bu, tarayıcıların onu kodunuza ifşa edeceği anlamına gelmez. Olmaz, çünkü Access-Control-Allow-Origin
yanıt başlığı yoktur . Yani onu almak için bunun yerine bir proxy kullanmalısınız.
Proxy bu siteye istekte bulunur, yanıtı alır, Access-Control-Allow-Origin
yanıt başlığını ve gereken diğer CORS başlıklarını ekler , ardından bunu istek kodunuza geri gönderir. Access-Control-Allow-Origin
Üstbilgi eklenmiş olan bu yanıt , tarayıcının gördüğü şeydir, böylece tarayıcı ön uç kodunuzun gerçekten yanıta erişmesine izin verir.
Bu yüzden, CORS'u devre dışı bırakacak bir nesneyi Getirme'ime geçirmeye çalışıyorum.
Bunu yapmak istemezsin. Açık olmak gerekirse, "CORS'u devre dışı bırakmak" istediğinizi söylediğinizde, aslında aynı kökenli politikayı devre dışı bırakmak istediğinizi kastetmişsinizdir . CORS'un kendisi aslında bunu yapmanın bir yoludur - CORS, aynı menşeli politikayı kısıtlamanın bir yolu değil, gevşetmenin bir yoludur.
Ancak yine de, - yalnızca yerel ortamınızda - güvenliği devre dışı bırakmak ve güvensiz şekilde çalıştırmak için tarayıcınıza çalışma zamanı bayrakları vermek gibi şeyler yapabileceğiniz veya aynı kaynak politikasını aşmak için yerel olarak bir tarayıcı uzantısı yükleyebileceğiniz doğru, ancak bunların hepsi yerel olarak sizin için durumu değiştirmektir.
Yerel olarak neyi değiştirirseniz değiştirin, uygulamanızı kullanmaya çalışan herhangi biri yine de aynı kaynak politikasına tabi olacaktır ve bunu uygulamanızın diğer kullanıcıları için devre dışı bırakmanın bir yolu yoktur.
Muhtemelen mode: 'no-cors'
birkaç sınırlı durum dışında pratikte kullanmak istemezsiniz ve o zaman bile sadece ne yaptığınızı ve etkilerinin ne olduğunu tam olarak biliyorsanız. Bunun nedeni mode: 'no-cors'
, tarayıcıya aslında "Ön uç JavaScript kodumun yanıt gövdesi ve başlıkların içeriğine her koşulda bakmasını engelle" demesidir. Çoğu durumda, açıkça istediğiniz şey bu değil.
Uzak durumlarda Olarak ne zaman olacağını kullanmayı düşünebilirsiniz mode: 'no-cors'
yanıtı şu bkz sınırlamalar opak yanıtları için geçerli ne olacak? detaylar için. İşin özü, davaların şunlar olmasıdır:
Eğer bir içine başka orijinli içeriği koymak için JavaScript kullanıyorsanız sınırlı durumda <script>
, <link rel=stylesheet>
, <img>
, <video>
, <audio>
, <object>
, <embed>
, veya <iframe>
ama nedense sen don' - (kaynakların katıştırma çapraz kökenli olanlar için izin verilir çünkü çalışır) elemanı Bunu, yalnızca belgenin biçimlendirmesinin öğe için href
veya src
özniteliği olarak kaynak URL'sini kullanmasını sağlayarak yapmak istemez veya yapamazsınız .
Bir kaynakla yapmak istediğiniz tek şey onu önbelleğe almak olduğunda. Yanıtta ima edildiği gibi, opak yanıtlar için hangi sınırlamalar geçerlidir? , pratikte geçerli olan senaryo, Hizmet Çalışanları'nı kullandığınız zamandır, bu durumda ilgili API, Önbellek Depolama API'sidir .
Ancak bu sınırlı durumlarda bile, dikkat edilmesi gereken bazı önemli sorunlar vardır; En cevap bkz Ne sınırlamalar opak yanıtları için geçerlidir? detaylar için.
Ben de nesneyi geçmeye çalıştım { mode: 'opaque'}
mode: 'opaque'
İstek modu yoktur - opaque
bunun yerine yalnızca yanıtın bir özelliğidir ve tarayıcılar no-cors
modla gönderilen isteklerden gelen yanıtlarda bu opak özelliği ayarlar.
Ancak tesadüfen opak kelimesi , sonuçta elde ettiğiniz yanıtın doğası hakkında oldukça açık bir işarettir: "opak", onu göremeyeceğiniz anlamına gelir.
cors-anywhere
Üretim dışı basit kullanım durumları için geçici çözümü sevin (yani, herkese açık bazı verileri getirmek). Bu yanıtno-cors
, OpaqueResponse çok yararlı olmadığı için yaygın olmayan şüphelerimi doğruluyor ; yani "çok sınırlı durumlar"; kimse bana nerelerinno-cors
yararlı olduğunu açıklayabilir mi?