Åimdiye kadar fetch hakkında biraz bilgi edindik.
Åimdi tamamını kapsayacak Åekilde APIânin tüm yeteneklerini görelim.
Varsayılan deÄerleriyle olası tüm fetch iÅlemlerinin tam listesi iÅte burada (diÄer alternatifler yorumlarda)
let promise = fetch(url, {
method: "GET", // POST, PUT, DELETE vb.
headers: {
"Content-Type": "text/plain;charset=UTF-8" // for a string body, depends on body
},
body: undefined // string, FormData, Blob, BufferSource ya da URLSearchParams
referrer: "about:client", // no-referrer için "" ya da mevcut baÅlangıç noktasından bir URL
referrerPolicy: "no-referrer-when-downgrade", // no-referrer, origin, same-origin...
mode: "cors", // same-origin, no-cors
credentials: "same-origin", // omit, include
cache: "default", // no-store, reload, no-cache, force-cache ya da only-if-cached
redirect: "follow", // manual, error
integrity: "", // bir hash, "sha256-abcdef1234567890" gibi
keepalive: false, // true
signal: undefined, // İsteÄi iptal etmek için AbortController
window: window // null
});
Etkileyici bir liste, deÄil mi?
Fetch: Temel Bilgiler bölümünde method, headers ve body tamamıyla ele alındı .
signal ise Fetch: Abort bölümünde ele alındı.
Åimdi diÄer özelliklerini inceleyelim.
referrer, referrerPolicy
Bu özellikler fetch iÅleminin HTTP Referer bilgisini nasıl ayarladıÄını düzenler.
Bu baÅlık, istek yapan sayfanın URLâsini içerir. ÃoÄu durumda çok küçük bir bilgilendirme rolü oynar ama bazen güvenlik amacıyla kaldırmak veya deÄiÅtirmek daha mantıklıdır.
referrer özelliÄi baÅlangıçtaki mevcut herhangi bir Refererâın ayarlanmasına veya devre dıÅı bırakılmasına izin verir.
Referer göndermemek için boŠbir string yazın:
fetch('/page', {
referrer: "" // Referer içeriÄi boÅ
});
Mevcut baÅlangıç noktasında baÅka bir URL ayarlamak için:
fetch('/page', {
// https://javascript.infoâda olduÄumuzu varsayarsak
// herhangi bir Referer bilgisini ayarlayabiliriz ancak sadece mevcut baÅlangıç noktası dahilinde
referrer: "https://javascript.info/anotherpage"
});
referrerPolicy, Referer için genel kurallar belirler.
Olası deÄerler Referrer Policy spesifikasyonunda açıklanmıÅtır:
"no-referrer-when-downgrade"â Varsayılan deÄer: HTTPSâten HTTPâye bir istek göndermediÄimiz süreceRefererher zaman gönderilir (güvenlik protokolü daha az)."no-referrer"â Hiçbir zamanReferergöndermez."origin"â Belli bir URLâyi deÄil, sadeceRefererkaynaÄını gönderir. ÃrneÄinhttp://site.com/pathyerinehttp://site.comgibi."origin-when-cross-origin"â Refererâın tamamını aynı kaynaÄa gönderir ancak kaynaklar arasındaki istekler için yalnızca kaynak kısmını gönderir."same-origin"â Aynı kök URLâye tam Referer gönderir, ancak farklı kök URLâler arasındaki istekler için Referer göndermez."strict-origin"â Sadece kök URLâyi gönderir, HTTPSâHTTP istekleri için Referer göndermez."strict-origin-when-cross-origin"â Aynı kök URLâye tam Referer gönderir, farklı kök URLâler arasındaki istekler için sadece kök URL gönderir ancak HTTPSâHTTP isteÄi durumunda hiçbir Åey göndermez."unsafe-url"â Her zamanRefererâda tam URLâyi gönderir.
Diyelim ki dıÅarıdan görünmemesi gereken URL yapılarına sahip bir yönetici bölgesi (admin zone) var.
EÄer farklı bir kaynaktan (cross-origin) bir istek gönderirsek varsayılan olarak isteÄimiz Referer baÅlıÄını sayfanın tam URLâsiyle birlikte gönderir (ancak HTTPSâten HTTPâye istek gönderdiÄimizde Referer gönderilmez).
ÃrneÄin Referer: https://javascript.info/admin/secret/paths.
Referrerâı tamamen gizleme istiyorsak:
fetch('https://another.com/page', {
referrerPolicy: "no-referrer" // no Referer, referrer: ""'la aynı iÅlevi görür
});
Aksi takdirde, uzak tarafın isteÄin nereden geldiÄini görmesini istiyorsak, sadece URLânin âoriginâ (kök) kısmını gönderebiliriz:
fetch('https://another.com/page', {
referrerPolicy: "strict-origin" // Referer: https://javascript.info
});
mode
mode seçeneÄi, kaynaklararası istekleri önlemek için bir güvenlik önlemi olarak hizmet eder.
"cors"â Varsayılan olarak Fetch: Cross-Origin Requestsâde açıklandıÄı gibi kaynaklararası isteklere izin verilir,"same-origin"â Kaynaklararası isteklere izin verilmez,"no-cors"â Sadece basit olan kaynaklararası isteklere izin verilir.
Bu, fetch iÅleminin URLâsinin üçüncü taraf bir kaynaktan geldiÄi durumlarda ve kaynaklararası yeteneklerini sınırlamak için bir âgüç kapama anahtarıâ istediÄimiz durumlarda faydalı olabilir.
credentials
credentials, fetch iÅleminin isteÄiyle birlikte çerezleri ve HTTP-Authorization baÅlıklarını gönderip göndermeyeceÄini belirtir.
"same-origin"â Varsayılan deÄerdir, kaynaklararası istekler için göndermez,"include"â Her zaman gönderir ancak kaynaklararası sunucudanAccept-Control-Allow-Credentialsgerektirir,"omit"â Hiçbir zaman göndermez hatta aynı kök URLâye sahip istekler için bile göndermez.
cache
Varsayılan olarak fetch istekleri standart HTTP önbellekleme kurallarını kullanır. Yani Expires, Cache-Control baÅlıklarını dikkate alıp If-Modified-Since gibi baÅlıklar gönderir. Adeta normal HTTP istekleri gibi davranır.
cache, HTTP önbelleÄini yok saymak veya kullanımını ayarlamak için kullanılır:
"default"âfetch, standart HTTP önbellekleme kurallarını ve baÅlıklarını kullanır;"no-store"â HTTP önbelleÄini tamamen yok sayar. EÄerIf-Modified-Since,If-None-Match,If-Unmodified-Since,If-MatchveyaIf-RangebaÅlıklarından herhangi birini set edersek bu mod varsayılan olur;"reload"â Sonucu HTTP önbellekten almadan (eÄer varsa) cevap ile önbelleÄi doldurur (eÄer cevap baÅlıkları buna izin veriyorsa);"no-cache"â Ãnbellekte bir yanıt varsa koÅullu bir istek oluÅturur aksi takdirde normal bir istek yapar. HTTP önbelleÄi ile cevabı doldurur;"force-cache"â Yanıtı HTTP önbelleÄinden alır hatta eskimiÅ olsa bile. EÄer HTTP önbelleÄinde yanıt yoksa normal bir HTTP isteÄi yapar ve normal davranır;"only-if-cached"â Yanıtı HTTP önbelleÄinden alır hatta eskimiÅ olsa bile. EÄer HTTP önbelleÄinde yanıt yoksa hata döner. SadecemodedeÄeri"same-origin"olduÄunda çalıÅır.
redirect
Normalde fetch iÅlemi 301, 302 gibi HTTP yönlendirmelerini Åeffaf bir Åekilde takip eder.
redirect seçeneÄi bu davranıÅı deÄiÅtirmemizi saÄlar:
"follow"â Varsayılan deÄerdir, HTTP yönlendirmelerini takip eder,"error"â HTTP yönlendirmesi durumunda hata verir,"manual"â HTTP yönlendirmelerini takip etmez ancakresponse.urlyeni URL olacak veresponse.redirecteddeÄeritrueolacak böylece ihtiyaç halinde yönlendirmeyi manuel olarak yeni URLâye gerçekleÅtirebiliriz.
integrity
integrity, yanıtın önceden bilinen bir karma (checksum) ile eÅleÅip eÅleÅmediÄini kontrol etmemize olanak saÄlar.
specificationâda açıklandıÄı gibi, desteklenen fonksiyonlar SHA-256, SHA-384 ve SHA-512âdir ve tarayıcıya göre baÅka fonksiyonları da olabilir.
ÃrneÄin bir dosyayı indiriyoruz ve dosyanın SHA-256 karma deÄerinin âabcâ olduÄunu biliyoruz (gerçek bir karma deÄeri tabii ki daha uzundur).
Bunu aÅaÄıdaki gibi integrity seçeneÄine ekleyebiliriz:
fetch('http://site.com/file', {
integrity: 'sha256-abd'
});
Daha sonra fetch iÅlemi kendi baÅına SHA-256 hesaplar ve hesapladıÄı deÄeri bizim verdiÄimiz deÄerle karÅılaÅtırır. EÅleÅme olmaması durumunda bir hata tetiklenir.
keepalive
keepalive, isteÄin sayfadan ayrıldıktan sonra dahi gerçekleÅtirilebileceÄini belirtir.
ÃrneÄin mevcut ziyaretçinin sayfamızı nasıl kullandıÄıyla ilgili istatistikleri topluyoruz (fare tıklamaları, görüntülediÄi sayfa parçaları) ve kullanıcı deneyimini iyileÅtirmek amacıyla bunları sunucumuza kaydetmek istiyoruz.
Ziyaretçi sayfadan ayrıldıÄında bu bilgileri sunucumuza kaydetmek istiyoruz.
Bunu yapmak için window.onunload özelliÄini kullanabiliriz:
window.onunload = function() {
fetch('/analytics', {
method: 'POST',
body: "statistics",
keepalive: true
});
};
Normalde bir belge yüklenirken iliÅkili tüm aÄ istekleri iptal edilir ancak keepalive tarayıcının isteÄi arka planda yapmasını ve sayfadan ayrıldıktan sonra bile gerçekleÅtirmesini saÄlar. Bu nedenle isteÄin baÅarıyla gerçekleÅmesi için bu seçeneÄin kullanılması önemlidir.
- Megabaytlarca veri gönderemeyiz:
keepaliveistekleri için sınır 64 KBâdır- Daha fazla veri toplarsak düzenli olarak göndermemiz gerekir böylece âonunloadâ isteÄi için çok fazla veri olmaz.
- Limit tüm devam eden istekler için geçerlidir. Bu nedenle 64 KB boyutunda 100 istek oluÅturarak bu sınırı aÅabiliriz.
onunloaddurumunda sunucu cevabını alamayız çünkü belge o zaman zaten yüklenmemiÅtir.- Genellikle sunucu böyle isteklere boÅ bir cevap gönderir bu nedenle bu durumda bir sorun olmaz.
Yorumlar
<code>kullanınız, birkaç satır eklemek için ise<pre>kullanın. EÄer 10 satırdan fazla kod ekleyecekseniz plnkr kullanabilirsiniz)