JusquâĂ prĂ©sent, nous en savons pas mal sur fetch.
Voyons le reste de lâAPI, pour couvrir toutes ses capacitĂ©s.
Remarque: la plupart de ces options sont rarement utilisées. Vous pouvez ignorer ce chapitre et continuer à utiliser fetch correctement.
Pourtant, il est bon de savoir ce que fetch peut faire, donc si le besoin sâen fait sentir, vous pouvez revenir et lire les dĂ©tails.
Voici la liste complÚte de toutes les options possibles de fetch avec leurs valeurs par défaut (alternatives dans les commentaires) :
let promise = fetch(url, {
method: "GET", // POST, PUT, DELETE, etc.
headers: {
// la valeur de l'en-tĂȘte du type de contenu est gĂ©nĂ©ralement dĂ©finie automatiquement
// selon la requĂȘte du body
"Content-Type": "text/plain;charset=UTF-8"
},
body: undefined, // string, FormData, Blob, BufferSource, ou URLSearchParams
referrer: "about:client", // ou "" to send no Referer header,
// or an url from the current origin
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, or only-if-cached
redirect: "follow", // manual, error
integrity: "", // un hash, comme "sha256-abcdef1234567890"
keepalive: false, // true
signal: undefined, // AbortController pour annuler la requĂȘte
window: window // null
});
Une liste impressionnante, non ?
Nous avons entiĂšrement couvert method, headers et body dans le chapitre Fetch.
Lâoption signal est couverte dans Fetch: Abort.
Explorons maintenant le reste des capacités.
referrer, referrerPolicy
Ces options rĂ©gissent la façon dont fetch dĂ©finit lâen-tĂȘte HTTP Referer.
Habituellement, cet en-tĂȘte est dĂ©fini automatiquement et contient lâurl de la page Ă lâorigine de la requĂȘte. Dans la plupart des scĂ©narios, ce nâest pas important du tout, parfois, pour des raisons de sĂ©curitĂ©, il est logique de le supprimer ou de le raccourcir.
Lâoption referer permet de dĂ©finir nâimporte quel Referer dans lâorigine actuelle) ou de le supprimer.
Pour nâenvoyer aucun referer, dĂ©finissez une chaĂźne de caractĂšres vide :
fetch('/page', {
referrer: "" // pas de header Referer
});
Pour dĂ©finir une autre URL dans lâorigine actuelle :
fetch('/page', {
// en supposant que nous sommes sur https://javascript.info
// nous pouvons dĂ©finir n'importe quel en-tĂȘte Referer, mais uniquement dans l'origine actuelle
referrer: "https://javascript.info/anotherpage"
});
Lâoption referrerPolicy Ă©tablit des rĂšgles gĂ©nĂ©rales pour Referer.
Les requĂȘtes sont divisĂ©es en 3 types :
- RequĂȘte Ă la mĂȘme origine.
- RequĂȘte Ă une autre origine.
- RequĂȘte de HTTPS Ă HTTP (du protocole sĂ»r au protocole non sĂ©curisĂ©).
Contrairement Ă lâoption referrer qui permet de dĂ©finir la valeur exacte de Referer, referrerPolicy indique les rĂšgles gĂ©nĂ©rales du navigateur pour chaque type de requĂȘte.
Les valeurs possibles sont décrites dans la spécification Referrer Policy:
"strict-origin-when-cross-origin"â la valeur par dĂ©faut : pour la mĂȘme origine, envoie leReferercomplet, pour lâorigine croisĂ©e, envoie uniquement lâorigine, Ă moins quâil ne sâagisse dâune requĂȘte HTTPSâHTTP , puis nâenvoie rien."no-referrer-when-downgrade"â leReferercomplet est toujours envoyĂ©, sauf si nous envoyons une requĂȘte de HTTPS Ă HTTP (vers le protocole le moins sĂ©curisĂ©)."no-referrer"â nâenvoie jamais leReferer."origine"â nâenvoie que lâorigine dans leReferer, pas lâURL complĂšte de la page, par ex. uniquementhttp://site.comau lieu dehttp://site.com/path."origin-when-cross-origin"â envoie leReferercomplet Ă la mĂȘme origine, mais uniquement la partie dâorigine pour les requĂȘtes cross-origin (comme ci-dessus)."same-origin"â envoie leReferercomplet Ă la mĂȘme origine, mais pas deRefererpour les requĂȘtes cross-origin."strict-origin"â envoie uniquement lâorigine, pas leRefererpour les requĂȘtes HTTPSâHTTP."unsafe-url"â envoie toujours lâurl complĂšte dansReferer, mĂȘme pour les requĂȘtes HTTPSâHTTP.
Voici un tableau avec toutes les combinaisons :
| Valeur | Pour la mĂȘme origine | Pour une autre origine | HTTPSâHTTP |
|---|---|---|---|
"no-referrer" |
- | - | - |
"no-referrer-when-downgrade" |
full | full | - |
"origin" |
origin | origin | origin |
"origin-when-cross-origin" |
full | origin | origin |
"same-origin" |
full | - | - |
"strict-origin" |
origin | origin | - |
"strict-origin-when-cross-origin" or "" (default) |
full | origin | - |
"unsafe-url" |
full | full | full |
Disons que nous avons une zone dâadministration avec une structure dâURL qui ne devrait pas ĂȘtre connue de lâextĂ©rieur du site.
Si nous envoyons un fetch, alors par dĂ©faut, il envoie toujours lâen-tĂȘte Referer avec lâurl complĂšte de notre page (sauf lorsque nous demandons de HTTPS Ă HTTP, alors pas de Referer).
Par exemple : Referer: https://javascript.info/admin/secret/paths.
Si nous souhaitons que dâautres sites Web connaissent uniquement la partie origin, pas le chemin URL, nous pouvons dĂ©finir lâoption :
fetch('https://another.com/page', {
// ...
referrerPolicy: "origin-when-cross-origin" // Referer: https://javascript.info
});
Nous pouvons le mettre Ă tous les appels fetch, peut-ĂȘtre lâintĂ©grer dans la bibliothĂšque JavaScript de notre projet qui fait toutes les requĂȘtes et utilise fetch Ă lâintĂ©rieur.
Sa seule diffĂ©rence par rapport au comportement par dĂ©faut est que pour les requĂȘtes vers une autre origine, fetch envoie uniquement la partie origine de lâURL (par exemple https://javascript.info, sans le chemin). Pour les requĂȘtes Ă notre origine, nous obtenons toujours le Referer complet (peut-ĂȘtre utile Ă des fins de dĂ©bogage).
fetchLa Referrer policy, dĂ©crite dans la spĂ©cification, nâest pas seulement pour fetch, mais plus globale.
Plus particuliĂšrement, il est possible de dĂ©finir la politique par dĂ©faut pour toute la page en utilisant lâen-tĂȘte HTTP Referrer-Policy, ou par lien, avec <a rel="noreferrer">.
mode
Lâoption mode est un garde-fou qui empĂȘche les requĂȘtes cross-origin occasionnelles :
"cors"â par dĂ©faut, les requĂȘtes cross-origin sont autorisĂ©es, comme dĂ©crit dans Fetch: RequĂȘtes Cross-Origin,"same-origin"â les requĂȘtes cross-origin requests sont interdites,"no-cors"â seules les requĂȘtes cross-origin sĂ©curisĂ©es sont autorisĂ©es.
Cette option peut ĂȘtre utile lorsque lâURL de fetch provient dâun tiers, et nous voulons un âinterrupteur de mise hors tensionâ pour limiter les capacitĂ©s de cross-origin.
credentials
Lâoption credentials spĂ©cifie si fetch doit envoyer des cookies et des en-tĂȘtes dâautorisation HTTP avec la requĂȘte.
"same-origin"â par dĂ©faut, nâenvoyez pas de requĂȘtes cross-origin,"include"â toujours envoyer, nĂ©cessiteAccept-Control-Allow-Credentialsdu serveur cross-origin pour que JavaScript accĂšde Ă la rĂ©ponse, qui a Ă©tĂ© traitĂ©e dans le chapitre Fetch: RequĂȘtes Cross-Origin,"omit"â ne jamais envoyer, mĂȘme pour des requĂȘtes cross-origin.
cache
Par dĂ©faut, les requĂȘtes fetch utilisent la mise en cache HTTP standard. Autrement dit, il honore les en-tĂȘtes Expires et Cache-Control, envoie If-Modified-Since, et ainsi de suite. Tout comme les requĂȘtes HTTP rĂ©guliĂšres.
Les options cache permettent dâignorer le cache HTTP ou dâaffiner son utilisation :
"default"âfetchutilise des rĂšgles et des en-tĂȘtes de cache HTTP standard,"no-store"â ignore totalement le cache HTTP, ce mode devient la valeur par dĂ©faut si nous dĂ©finissons un en-tĂȘteIf-Modified-Since,If-None-Match,If-Unmodified-Since,If-Match, ouIf-Range,"reload"â ne prenez pas le rĂ©sultat du cache HTTP (le cas Ă©chĂ©ant), mais remplissez le cache avec la rĂ©ponse (si les en-tĂȘtes de rĂ©ponse le permettent),"no-cache"â crĂ©er une requĂȘte conditionnelle sâil y a une rĂ©ponse mise en cache, et sinon une requĂȘte normale. Remplissez le cache HTTP avec la rĂ©ponse,"force-cache"â utilise une rĂ©ponse du cache HTTP, mĂȘme si elle est pĂ©rimĂ©e. Sâil nây a pas de rĂ©ponse dans le cache HTTP, fait une requĂȘte HTTP rĂ©guliĂšre, se comporte normalement,"only-if-cached"â utilise une rĂ©ponse du cache HTTP, mĂȘme si elle est pĂ©rimĂ©e. Sâil nây a pas de rĂ©ponse dans le cache HTTP, alors erreur. Fonctionne uniquement lorsque lemodeest sur"same-origin".
redirect
Normalement, fetch suit de maniĂšre transparente les redirections HTTP, comme 301, 302 etc.
Lâoption redirect permet de changer cela :
"follow"â par dĂ©faut, suit les redirections HTTP,"error"â erreur en cas de redirection HTTP,"manual"â permet de traiter manuellement les redirections HTTP. En cas de redirection, nous obtiendrons un objet de rĂ©ponse spĂ©cial, avecresponse.hype="opaqueredirect"et un statut zĂ©ro/vide ainsi que la plupart des autres propriĂ©tĂ©s.
integrity
Lâoption intĂ©gritĂ© permet de vĂ©rifier si la rĂ©ponse correspond Ă la somme de contrĂŽle connue Ă lâavance.
Comme dĂ©crit dans la spĂ©cification, les fonctions de hachage prises en charge sont SHA-256, SHA-384 et SHA-512, il peut y en avoir dâautres en fonction du navigateur.
Par exemple, nous tĂ©lĂ©chargeons un fichier et nous savons que sa somme de contrĂŽle SHA-256 est âabcdefâ (une vraie somme de contrĂŽle est plus longue, bien sĂ»r).
Nous pouvons le mettre dans lâoption integrity, comme ceci :
fetch('http://site.com/file', {
integrity: 'sha256-abcdef'
});
Ensuite, fetch calculera SHA-256 seul et le comparera avec notre chaßne de caractÚres. En cas de non-concordance, une erreur est déclenchée.
keepalive
Lâoption keepalive indique que la demande peut âsurvivreâ Ă la page Web qui lâa initiĂ©e.
Par exemple, nous recueillons des statistiques sur la façon dont le visiteur actuel utilise notre page (clics de souris, fragments de page quâil consulte), pour analyser et amĂ©liorer lâexpĂ©rience utilisateur.
Lorsque le visiteur quitte notre page â nous aimerions enregistrer les donnĂ©es sur notre serveur.
Nous pouvons utiliser lâĂ©vĂ©nement window.onunload pour cela :
window.onunload = function() {
fetch('/analytics', {
method: 'POST',
body: "statistics",
keepalive: true
});
};
Normalement, lorsquâun document est dĂ©chargĂ©, toutes les requĂȘtes rĂ©seau associĂ©es sont abandonnĂ©es. Mais lâoption keepalive indique au navigateur dâexĂ©cuter la requĂȘte en arriĂšre-plan, mĂȘme aprĂšs avoir quittĂ© la page. Cette option est donc essentielle Ă la rĂ©ussite de notre demande.
Elle a quelques limitations :
- Nous ne pouvons pas envoyer des mĂ©gaoctets : la limite de corps pour les requĂȘtes
keepaliveest de 64kb.- Si nous avons besoin de rassembler beaucoup de statistiques sur la visite, nous devons les envoyer rĂ©guliĂšrement par paquets, afin quâil ne reste plus grand-chose pour la derniĂšre requĂȘte
onunload. - Cette limite sâapplique Ă toutes les demandes
keepaliveensemble. En dâautres termes, nous pouvons effectuer plusieurs requĂȘteskeepaliveen parallĂšle, mais la somme de leurs longueurs de corps ne doit pas dĂ©passer 64 Kb.
- Si nous avons besoin de rassembler beaucoup de statistiques sur la visite, nous devons les envoyer rĂ©guliĂšrement par paquets, afin quâil ne reste plus grand-chose pour la derniĂšre requĂȘte
- Nous ne pouvons pas gérer la réponse du serveur si le document est déchargé. Donc, dans notre exemple,
fetchrĂ©ussira grĂące Ăkeepalive, mais les fonctions suivantes ne fonctionneront pas.- Dans la plupart des cas, comme lâenvoi de statistiques, ce nâest pas un problĂšme, car le serveur accepte simplement les donnĂ©es et envoie gĂ©nĂ©ralement une rĂ©ponse vide Ă de telles demandes.
Commentaires
<code>, pour plusieurs lignes â enveloppez-les avec la balise<pre>, pour plus de 10 lignes - utilisez une sandbox (plnkr, jsbin, codepenâŠ)