O metodÄ fetch jsme se už leccos dozvÄdÄli.
PodÃvejme se nynà na zbytek API, abychom probrali vÅ¡echny jejà možnosti.
ProsÃme vÅ¡imnÄte si, že vÄtÅ¡ina zde uvedených voleb se použÃvá jen vzácnÄ. Metodu fetch budete moci správnÄ použÃvat, i když tuto kapitolu pÅeskoÄÃte.
Je vÅ¡ak dobré vÄdÄt, co vÅ¡echno fetch umÃ, a v pÅÃpadÄ potÅeby se sem vrátit a pÅeÄÃst si podrobnosti.
NásledujÃcà seznam obsahuje vÅ¡echny volby fetch spolu s jejich standardnÃmi hodnotami (alternativy jsou uvedeny v komentáÅÃch):
let pÅÃslib = fetch(url, {
method: "GET", // POST, PUT, DELETE, atd.
headers: {
// hodnota hlaviÄky s typem obsahu se obvykle nastavuje automaticky
// v závislosti na tÄle požadavku
"Content-Type": "text/plain;charset=UTF-8"
},
body: undefined, // ÅetÄzec, FormData, Blob, BufferSource nebo URLSearchParams
referrer: "about:client", // nebo "", aby nebyla poslána žádná hlaviÄka Referer,
// nebo URL z aktuálnÃho původu
referrerPolicy: "strict-origin-when-cross-origin", // 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 nebo only-if-cached
redirect: "follow", // manual, error
integrity: "", // kontrolnà souÄet, napÅ. "sha256-abcdef1234567890"
keepalive: false, // true
signal: undefined, // AbortController pro zastavenà požadavku
window: window // null
});
Ãctyhodný seznam, že?
V kapitole Fetch jsme podrobnÄ probrali method, headers a body.
V kapitole Fetch: zrušenà stahovánà jsme probrali volbu signal.
Nynà prozkoumejme ostatnà volby.
referrer, referrerPolicy
Tyto volby stanovujà způsob, jak fetch nastavuje HTTP hlaviÄku Referer.
Tato hlaviÄka je obvykle nastavována automaticky a obsahuje URL stránky, která vytvoÅila požadavek. Ve vÄtÅ¡inÄ scénáÅů nenà vůbec důležitá, ale nÄkdy z bezpeÄnostnÃch důvodů má smysl ji odstranit nebo zkrátit.
Volba referrer umožÅuje nastavit libovolný Referer (v rámci aktuálnÃho původu) nebo jej odstranit.
Nechceme-li poslat žádný referer, nastavÃme prázdný ÅetÄzec:
fetch('/page', {
referrer: "" // bez hlaviÄky Referer
});
Chceme-li nastavit jinou URL uvnitÅ aktuálnÃho původu:
fetch('/page', {
// pÅedpokládejme, že jsme na https://javascript.info
// můžeme nastavit jakoukoli hlaviÄku Referer, ale jen uvnitÅ aktuálnÃho původu
referrer: "https://javascript.info/jinastranka"
});
Volba referrerPolicy nastavuje obecná pravidla pro Referer.
Požadavky se dÄlà na tÅi druhy:
- Požadavky na stejný původ.
- Požadavky na jiný původ.
- Požadavky z HTTPS na HTTP (z bezpeÄného protokolu na ménÄ bezpeÄný).
Na rozdÃl od volby referrer, která umožÅuje hodnotu Referer pÅesnÄ nastavit, referrerPolicy sdÄluje prohlÞeÄi obecná pravidla pro vÅ¡echny druhy požadavků.
Možné hodnoty jsou popsány ve specifikaci politiky refereru:
"strict-origin-when-cross-origin"â standardnà hodnota: na stejný původ se posÃlá úplnýReferer, na jiný původ se posÃlá jen původ, pÅi požadavku HTTPSâHTTP se neposÃlá nic."no-referrer-when-downgrade"â vždy se posÃlá úplnýReferers výjimkou požadavků z HTTPS na HTTP (na ménÄ bezpeÄný protokol)."no-referrer"âRefererse nikdy neposÃlá."origin"â vRefererse posÃlá jen původ a ne celé URL stránky, napÅ. jenhttp://site.commÃstohttp://site.com/path."origin-when-cross-origin"â na stejný původ se posÃlá úplnýReferer, ale u požadavků jiného původu jen původ (stejnÄ jako výše)."same-origin"â na stejný původ se posÃlá úplnýReferer, ale u požadavků jiného původu seRefererneposÃlá."strict-origin"â posÃlá se jen původ, u požadavků HTTPSâHTTP seRefererneposÃlá."unsafe-url"â vRefererse vždy posÃlá celá URL, i u požadavků HTTPSâHTTP.
NásledujÃcà tabulka obsahuje vÅ¡echny kombinace:
| Hodnota | Na stejný původ | Na jiný původ | HTTPSâHTTP |
|---|---|---|---|
"no-referrer" |
- | - | - |
"no-referrer-when-downgrade" |
úplný | úplný | - |
"origin" |
původ | původ | původ |
"origin-when-cross-origin" |
úplný | původ | původ |
"same-origin" |
úplný | - | - |
"strict-origin" |
původ | původ | - |
"strict-origin-when-cross-origin" nebo "" (standardnÄ) |
úplný | původ | - |
"unsafe-url" |
úplný | úplný | úplný |
ÅeknÄme, že máme administrátorskou zónu se strukturou URL, která by nemÄla být vidÄt mimo toto sÃdlo.
Jestliže poÅ¡leme fetch, standardnÄ poÅ¡le vždy hlaviÄku Referer s celou URL našà stránky (kromÄ požadavků z HTTPS na HTTP, které hlaviÄku Referer nebudou obsahovat).
NapÅÃklad Referer: https://javascript.info/admin/secret/paths.
Pokud bychom chtÄli, aby jiná webová sÃdla znala jen původ a ne celou URL cestu, můžeme nastavit:
fetch('https://another.com/page', {
// ...
referrerPolicy: "origin-when-cross-origin" // Referer: https://javascript.info
});
Můžeme to umÃstit do vÅ¡ech volánà fetch nebo tÅeba integrovat do JavaScriptové knihovny naÅ¡eho projektu, která provádà vÅ¡echny požadavky, a použÃt fetch v nÃ.
Jediný rozdÃl oproti standardnÃmu chovánà spoÄÃvá v tom, že na požadavky jiného původu fetch posÃlá jen ÄásteÄnou URL obsahujÃcà jen původ (napÅ. https://javascript.info bez cesty). Pro požadavky na náš původ budeme stále mÃt úplný Referer (což může být užiteÄné pro úÄely ladÄnÃ).
fetchPolitika refereru, popsaná ve specifikaci, nesloužà jen pro metodu fetch, ale je globálnÄjÅ¡Ã.
KonkrétnÄ je možné nastavit standardnà politiku pro celou stránku pomocà HTTP hlaviÄky Referrer-Policy nebo v jednotlivých odkazech pomocà <a rel="noreferrer">.
mode
Volba mode je zabezpeÄenÃ, které bránà nechtÄným požadavkům jiného původu:
"cors"â standardnÄ, požadavky jiného původu jsou povoleny, jak je popsáno v kapitole Fetch: požadavky jiného původu,"same-origin"â požadavky jiného původu jsou zakázány,"no-cors"â jsou povoleny jen bezpeÄné požadavky jiného původu.
Tato volba může být užiteÄná, když URL pro fetch pocházà od tÅetà strany a my bychom chtÄli âvypÃnaÄâ, který omezà možnosti posÃlánà požadavků jiného původu.
credentials
Volba credentials specifikuje, zda má fetch v požadavku posÃlat cookies a hlaviÄky pro HTTP autorizaci.
"same-origin"â standardnÄ, neposÃlajà se v požadavcÃch jiného původu,"include"â vždy se posÃlajÃ, od serveru jiného původu vyžadujeAccess-Control-Allow-Credentials, aby JavaScript mohl pÅistupovat k odpovÄdi, bylo to vysvÄtleno v kapitole Fetch: požadavky jiného původu,"omit"â nikdy se neposÃlajÃ, ani v požadavcÃch stejného původu.
cache
StandardnÄ požadavky fetch využÃvánà standardnà HTTP mezipamÄÅ¥. To znamená, že respektujà hlaviÄky Expires a Cache-Control, posÃlajà If-Modified-Since a podobnÄ, stejnÄ jako bÄžné HTTP požadavky.
Volba cache umožÅuje HTTP mezipamÄÅ¥ ignorovat nebo vyladit jejà použÃvánÃ:
"default"âfetchpoužÃvá standardnà pravidla a hlaviÄky pro HTTP mezipamÄÅ¥,"no-store"â HTTP mezipamÄÅ¥ se zcela ignoruje, tento režim se stane standardnÃm, jestliže nastavÃme hlaviÄkuIf-Modified-Since,If-None-Match,If-Unmodified-Since,If-MatchneboIf-Range,"reload"â nepÅebÃrá výsledek z HTTP mezipamÄti (pokud tam je), ale umÃstà do mezipamÄti odpovÄÄ (pokud hlaviÄky odpovÄdi tuto akci povolÃ),"no-cache"â pokud je odpovÄÄ v mezipamÄti, vytvoÅà podmÃnÄný požadavek, jinak vytvoÅà bÄžný požadavek. UmÃstà odpovÄÄ do HTTP mezipamÄti,"force-cache"â použije odpovÄÄ z HTTP mezipamÄti, i když je stará. Pokud v HTTP mezipamÄti nenà odpovÄÄ, vytvoÅà bÄžný HTTP požadavek a chová se jako obvykle,"only-if-cached"â použije odpovÄÄ z HTTP mezipamÄti, i když je stará. Pokud v HTTP mezipamÄti nenà odpovÄÄ, nastane chyba. Funguje jen tehdy, když jemodenastaven na"same-origin".
redirect
Za normálnÃch okolnostà fetch průhlednÄ následuje HTTP pÅesmÄrovánÃ, napÅ. 301, 302 atd.
Volba redirect to umožÅuje zmÄnit:
"follow"â standardnÃ, HTTP pÅesmÄrovánà je následováno,"error"â v pÅÃpadÄ HTTP pÅesmÄrovánà nastane chyba,"manual"â umožÅuje zpracovat HTTP pÅesmÄrovánà ruÄnÄ. V pÅÃpadÄ pÅesmÄrovánà obdržÃme speciálnà objekt odpovÄdi, který obsahujeodpovÄÄ.type="opaqueredirect"a nulový nebo prázdný status a vÄtÅ¡inu dalÅ¡Ãch vlastnostÃ.
integrity
Volba integrity umožÅuje zkontrolovat, zda odpovÄÄ odpovÃdá pÅedem známému kontrolnÃmu souÄtu.
Jak je popsáno ve specifikaci, podporované hashovacà funkce jsou SHA-256, SHA-384 a SHA-512. V závislosti na prohlÞeÄi mohou být i dalÅ¡Ã.
NapÅÃklad stahujeme soubor a vÃme, že jeho kontrolnà souÄet SHA-256 je âabcdefâ (skuteÄný kontrolnà souÄet by samozÅejmÄ byl delÅ¡Ã).
Můžeme jej umÃstit do volby integrity následovnÄ:
fetch('http://site.com/file', {
integrity: 'sha256-abcdef'
});
Pak fetch vypoÄÃtá SHA-256 sama o sobÄ a porovná ji s naÅ¡Ãm ÅetÄzcem. V pÅÃpadÄ neshody nastane chyba.
keepalive
Volba keepalive oznamuje, že požadavek může âpÅežÃtâ webovou stránku, která jej vyvolala.
NapÅÃklad shromažÄujeme statistiku o tom, jak aktuálnà návÅ¡tÄvnÃk využÃvá naÅ¡i stránku (jak kliká myÅ¡Ã, které Äásti stránky si zobrazuje), abychom uživatelské zkuÅ¡enosti analyzovali a vylepÅ¡ovali.
Když návÅ¡tÄvnÃk naÅ¡i stránku opustÃ, chtÄli bychom uložit data na server.
Můžeme k tomu využÃt událost window.onunload:
window.onunload = function() {
fetch('/analytics', {
method: 'POST',
body: "statistics",
keepalive: true
});
};
Za normálnÃch okolnostÃ, když je dokument odstranÄn, vÅ¡echny sÃÅ¥ové požadavky k nÄmu pÅÃsluÅ¡ejÃcà jsou zastaveny. AvÅ¡ak volba keepalive ÅÃká prohlÞeÄi, aby provedl požadavek v pozadÃ, i když návÅ¡tÄvnÃk opustil stránku. Tato volba je tedy pro úspÄch naÅ¡eho požadavku klÃÄová.
Má nÄkolik omezenÃ:
- Nemůžeme posÃlat megabyty dat: velikost tÄla u požadavků s
keepaliveje omezena na 64 KB.- Pokud potÅebujeme shromažÄovat velké množstvà statistických dat o návÅ¡tÄvÄ, mÄli bychom je odesÃlat pravidelnÄ v paketech, aby jich na poslednà požadavek
onunloadnezbylo pÅÃliÅ¡ mnoho. - Tento limit platà pro vÅ¡echny požadavky s
keepalivedohromady. Jinými slovy, můžeme provádÄt vÃce požadavků skeepalivesouÄasnÄ, ale souÄet délek jejich tÄl by nemÄl pÅekroÄit 64 KB.
- Pokud potÅebujeme shromažÄovat velké množstvà statistických dat o návÅ¡tÄvÄ, mÄli bychom je odesÃlat pravidelnÄ v paketech, aby jich na poslednà požadavek
- Pokud je dokument odstranÄn, nemůžeme zpracovat odpovÄÄ serveru. V naÅ¡em pÅÃkladu tedy
fetchdÃkykeepaliveuspÄje, ale dalšà funkce již nebudou fungovat.- Ve vÄtÅ¡inÄ pÅÃpadů, napÅÃklad pÅi odesÃlánà statistik, to nenà problém, jelikož server jenom pÅijme data a obvykle na takové požadavky odeÅ¡le prázdnou odpovÄÄ.
KomentáÅe
<code>, pro nÄkolik Åádků je obalte znaÄkou<pre>, pro vÃce než 10 Åádků vložte odkaz na pÃskoviÅ¡tÄ (plnkr, jsbin, codepenâ¦)