Opak yanıtlar için hangi sınırlamalar geçerlidir?


Yanıtlar:


127

Opak Yanıtların Başlıklarına / Gövdesine Erişim

Opak tepkiler etrafında en basit sınırlama çoğundan anlamlı bilgiler geri alınamıyor olmasıdır özellikleri arasında Responsesınıfına gibi headers, ya da çeşitli çağrı yöntemleri makyaj Bodygibi arayüz json()veya text(). Bu, opak bir yanıtın kara kutu doğasıyla uyumludur.

Opak Yanıtları Bir Sayfada Kaynak Olarak Kullanma

Opak yanıtlar, tarayıcı CORS olmayan bir çapraz kaynak kaynağının kullanılmasına izin verdiğinde bir web sayfasında kaynak olarak kullanılabilir. Mozilla Developer Network belgelerinden uyarlanmış, CORS olmayan çapraz kaynak kaynakların ve dolayısıyla opak yanıtların geçerli olduğu bir öğe alt kümesi aşağıda verilmiştir :

  • <script>
  • <link rel="stylesheet">
  • <img>, <video>Ve<audio>
  • <object> ve <embed>
  • <iframe>

Opak yanıtların geçerli olmadığı dikkate değer bir kullanım durumu font kaynakları içindir .

Genel olarak, bir sayfada belirli bir kaynak türü olarak opak bir yanıtı kullanıp kullanamayacağınızı belirlemek için ilgili spesifikasyonu kontrol edin. Örneğin, HTML spesifikasyonu, CORS dışı çapraz kaynak (yani opak) yanıtların, <script>hata bilgilerinin sızmasını önlemek için bazı sınırlamalarla birlikte öğeler için kullanılabileceğini açıklar .

Opak Yanıtlar ve Önbellek Depolama API'si

Bir "yakaladım" diye geliştirici içine çalışabilir opak yanıtlarıyla birlikte bunları kullanarak içerir Önbellek Depolama API . İki parça arka plan bilgisi önemlidir:

  • statusOpak yanıtın özelliği olan her zaman ayarlı0 olursa olsun orijinal isteği başarılı veya başarısız olsun.
  • İsteklerden herhangi birinden kaynaklanan yanıtlar 2XX aralığında olmayan bir durum koduna sahipse, Önbellek Depolama API'sinin add()/ addAll()yöntemlerinin her ikisi de reddedilir .

Bu iki noktadan, add()/ addAll()call'ın bir parçası olarak gerçekleştirilen istek opak bir yanıtla sonuçlanırsa, önbelleğe eklenemeyeceği anlaşılır.

Açıkça a yaparak fetch()ve ardından put()opak yanıtla yöntemi çağırarak bu sorunu çözebilirsiniz . Bunu yaparak, önbelleğe aldığınız yanıtın sunucunuz tarafından döndürülen bir hata olma riskini etkin bir şekilde kabul etmiş olursunuz.

const request = new Request('https://third-party-no-cors.com/', {mode: 'no-cors'});
// Assume `cache` is an open instance of the Cache class.
fetch(request).then(response => cache.put(request, response));

Opak Yanıtlar ve navigator.storage API

Alanlar arası bilgilerin sızmasını önlemek için, depolama kotası sınırlarını hesaplamak için kullanılan (yani bir QuotaExceededistisna atılıp atılmadığı) ve navigator.storageAPI tarafından bildirilen opak bir yanıtın boyutuna önemli bir dolgu eklenir .

Bu dolgunun ayrıntıları tarayıcıdan tarayıcıya değişir, ancak Google Chrome için bu, önbelleğe alınmış tek bir opak yanıtın genel depolama kullanımına katkıda bulunduğu minimum boyutun yaklaşık 7 megabayt olduğu anlamına gelir . Opak kaynakların gerçek boyutuna bağlı olarak depolama kotası sınırlamalarını normalde beklediğinizden çok daha erken kolayca aşabileceğinizden, kaç tane opak yanıtı önbelleğe almak istediğinizi belirlerken bunu aklınızda bulundurmalısınız.


1
Aslında bir aygıtın fiziksel depolamasında bu kadar yer kaplamaz. Kota hesaplamalarına katkıda bulunan sadece değerdir.
Jeff Posnick

1
Cevabınız buradaki
Çalışma Kutusu

14
Doğru, ama Çalışma
Kutusu

1
Bu, bu tür bir önbellekle birlikte bir görüntü CDN'si kullanmayı kötü bir tasarım yapar mı? (Ayrılan alanı boşa harcamak) Ana etki alanımızdan alınan bir dosyayı önbelleğe almak ve CDN bağlantısı (anahtar) ile açığa çıkarmak mümkün müdür? Örneğin, bir ağ isteğine gidip cdn.x.com/test.jpgönbellek isteklerini ana etki alanına alabilir miyim www.x.com/test.jpg?
cglacet

1
Bu sorunun etrafında bir hile buldum, bunun uygun bir çözüm olup olmadığı hakkında hiçbir fikrim yok, ancak temelde servis çalışanıma CDN gibi davranmasını sağlıyorum. Önbelleğe etki alanına göre URL'ler ekliyorum (örneğin, /test.jpgdaha sonra her bir getirme isteği için cdn.x.com/test.jpgURL'yi kaynak etki alanıyla değiştiriyorum (URL olur www.x.com/test.jpg), şuna benzer bir şey kullanıyorum:. const cacheUrl = (url.hostname == 'cdn.x.com')? new URL(event.target.location.origin + url.pathname): url;Daha sonra bu yeni url ile önbelleği talep ediyorum caches.match(cacheUrl), öyle görünüyor iyi çalışıyor. Bu yaklaşım hakkında herhangi bir
fikriniz var
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.