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â¦)