Opak yanıt nedir ve hangi amaca hizmet eder?


172

fetchEski bir web sitesinin URL'sini denedim ve bir hata oluştu:

Fetch API cannot load http://xyz.
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://abc' is therefore not allowed access.
If an opaque response serves your needs, set the request's mode to 'no-cors'
to fetch the resource with CORS disabled.

İletiyi anladım ve opak bir yanıt döndüren bir istek yapmaya çalıştım:

fetch("http://xyz", {'mode': 'no-cors'})

Tamam, şimdi çalışıyor ... ama okuyamıyorum. = \

O zaman opak bir yanıtın amacı nedir?

Yanıtlar:


149

Bir servis çalışanının agnostik bir önbellek gibi davrandığını düşünün. Tek hedefiniz ağdan alacağınız kaynakların aynısını sunmak, ancak daha hızlı. Elbette tüm kaynakların kaynağınızın bir parçası olmasını sağlayamazsınız (örneğin CDN'lerden sunulan kütüphaneleri düşünün). Hizmet çalışanı ağ yanıtlarını değiştirme potansiyeline sahip olduğundan, yanıtın içeriğiyle, üstbilgileriyle ve hatta sonuçla ilgilenmediğinizi garanti etmeniz gerekir. Sadece önbellek ve daha hızlı hizmet etmek için kara kutu olarak yanıtla ilgileniyorsunuz.

Bunun için { mode: 'no-cors' }yapılmıştı.


2
Ama Status codeher zaman 0, eğer başarılı olup olmadığını nasıl kontrol edilir status is never 200?
Angshuman Agarwal

3
Yapamazsın. Kara kutunun bir parçasıdır .
Salva

67

Opak yanıtlara JavaScript tarafından erişilemez, ancak yine de bunları Önbellek API'sı ile önbelleğe alabilir ve fetchbir hizmet çalışanındaki olay işleyicisinde yanıtlayabilirsiniz . Bu nedenle, uygulamanızı çevrimdışı yapmanıza, ayrıca kontrol edemediğiniz kaynaklara (örneğin, CORS başlıklarını ayarlamayan bir CDN'deki kaynaklar) faydalıdırlar.


1

Ayrıca Node JS uygulaması için bir çözüm var. CORS Anywhere, proxy isteğine CORS başlıkları ekleyen bir NodeJS proxy'sidir.

Proxy URL'si, kelimenin tam anlamıyla yoldan alınır, doğrulanır ve proxy gönderilir. Proksiye URI'nin protokol kısmı isteğe bağlıdır ve varsayılan olarak "http" dir. 443 numaralı bağlantı noktası belirtilirse, protokol varsayılan olarak "https" olur.

Bu paket, çerezler dışında http yöntemlerine veya başlıklarına herhangi bir kısıtlama getirmez. Kullanıcı kimlik bilgileri istenmesine izin verilmiyor. Uygulama, örneğin tarayıcıdan doğrudan ziyaretten kaçınmak için, bir isteği proxy için bir başlık gerektirecek şekilde yapılandırılabilir. https://robwu.nl/cors-anywhere.html


-3

Javascript cevap almak biraz zor, ben arka ucundan api alıp sonra ön uca çağırarak düzeltti.

public function get_typechange () {

    $ url = "https://........";
    $ json = file_get_contents ($url);
    $ data = json_decode ($ json, true);
    $ resp = json_encode ($data);
    $ error = json_last_error_msg ();
    return $ resp;

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.