Récupérez des données depuis les POP edge via HTTP ou HTTPS. La Fetch API fonctionne comme celle des navigateurs et prend en charge le chargement dynamique de contenu, l'interaction avec le backend ainsi que les tests A/B.
Définition de la méthode
Fetch est entièrement asynchrone et ne bloque pas l'exécution du script, sauf si vous utilisez await. Le système prend en charge jusqu'à quatre sous-requêtes simultanées et gère les connexions persistantes en interne.
Fetch prend en charge les requêtes HTTP et HTTPS. Chaque redirect compte comme une sous-requête, avec un maximum de 12 opérations redirect par requête.
-
Définition de la méthode
fetch(arg, init). Cette méthode suit la spécification MDN WorkerOrGlobalScope.fetch(). -
Limites de la méthode
La Fetch API accepte uniquement les noms de domaine, et non les adresses IP. Ports par défaut : 80 (HTTP) et 443 (HTTPS).
Les propriétés
credentials,referrer,referrerPolicy,cacheetintegritydu paramètreinitn'ont aucun effet.La valeur par défaut de
redirectestfollow, ce qui suit les réponses 3xx de l'origine. Définissezredirectsurmanualpour désactiver le suivi des redirections.
RemarqueLes modes Fetch spécifiques aux navigateurs ne s'appliquent pas. Sur CDN, DCDN ou ESA,
CROS fetchpermet de récupérer des données depuis n'importe quelle origine.Pour envoyer au moins quatre sous-requêtes, soumettez un ticket afin de demander une augmentation du quota.
La longueur totale d'une URL de requête ne peut pas dépasser 4 Ko.
Les ressources compressées en gzip sont décompressées par défaut lors de leur récupération. Ajoutez le paramètre
manualpour désactiver la décompression. Consultez la section Décompression pour plus de détails.
-
Définir un délai d'expiration
-
Fonction de temporisation
/** * Request timeout control implementation * * @param {Number} timeout Timeout period, in ms * @param {Object} config Timeout configuration * - @param {Object|Funtion} handler Value to return on timeout * @returns */ const RequestTimeout = (timeout, config) => { return new Promise((resolve) => { const { handler = null } = config; let timer = setTimeout(() => { clearTimeout(timer); timer = null; const defaultRes = (typeof handler === 'function' ? handler() : handler) || {}; resolve(defaultRes); }, timeout); }); }; -
Exemple d'appel
const KV_TIMEOUT = 1000; let edgekv = new EdgeKV({ namespace: KV_NS, }); let kvRequest = edgekv.get(key, getType); let timeoutPromise = RequestTimeout(KV_TIMEOUT, { handler: { res: {}, errorMessage: `kv request timeout (${KV_TIMEOUT}ms)`, } }); let resp = await Promise.race([ kvRequest, timeoutPromise, ]); if (resp === undefined) { return "kv not found, key = " + key; } else { return resp; }
-
Redirection
Fetch suit les redirections 3xx (301, 302, 303, 307, 308). Spécifiez l'un des trois comportements de redirection suivants :
{redirect: "manual"}: Ne suit pas les redirections 3xx. Vous devez gérer les redirections manuellement.{redirect: "error"}: Une erreur est levée pour les réponses 3xx.{redirect: "follow"}: (Par défaut) Suit les redirections 3xx. Un maximum de 20 redirections peuvent être suivies.
Comportement de redirection selon le code d'état :
|
Code d'état |
Détails de la redirection |
|
301, 302, 303, 308 |
La méthode de requête devient GET et le corps est ignoré. |
|
307 |
Seules les méthodes GET sont suivies. Une erreur est signalée pour les autres méthodes. |
Les redirections utilisent l'en-tête Location, qui est obligatoire. L'absence de cet en-tête provoque une erreur.
L'en-tête
Locationpeut contenir une liste d'URL séparées par des virgules (,). Seule la première URL est utilisée ; les autres sont ignorées.L'en-tête
Locationpeut contenir une URL absolue ou relative.
Décompression
La Fetch API permet de configurer un mode de décompression, par exemple fetch("https://www.example.com",{decompress: "manual"}). Le paramètre decompress accepte les valeurs suivantes :
manual : ne décompresse pas les données. Si le serveur renvoie des données compressées lors d'une requête fetch, les données reçues par EdgeRoutine (ER) restent compressées.
-
decompress : décompresse automatiquement les données. Il s'agit de la valeur par défaut. La Fetch API prend en charge la compression Gzip. ER détecte ou décompresse automatiquement les données selon l'en-tête Content-Encoding. Après la décompression, ER modifie la valeur de Content-Encoding. Si le paramètre Gzip est supprimé, configurez les paramètres suivants pour éviter les exceptions lors de la transmission des données :
content-encoding: gzip: ER reconnaît la valeur de Content-Encoding et décompresse les données.content-encoding: gzip, identity: ER reconnaît la valeur de Content-Encoding et décompresse les données.
RemarqueLes algorithmes autres que Gzip provoquent des exceptions.
fallbackIdentity : L'effet de cette valeur est similaire à celui de decompress. Si ER ne reconnaît pas cette valeur, il ne décompresse pas les données.
Une fois que la Fetch API a décompressé automatiquement les données, vous ne pouvez pas transmettre l'en-tête Content-Length tel quel si la réponse contient cet en-tête. En effet, Content-Length indique la taille des données avant décompression.
content-length
Lorsque content-length est défini, Fetch envoie le corps en utilisant l'encodage content-length. Sans content-length, Fetch envoie toutes les données du corps en utilisant l'encodage par morceaux (chunked).
-
Paramètres
content-lengthSi
content-lengthest un nombre non négatif : Fetch lit et envoie le nombre d'octets spécifié depuis le flux du corps. Les données sont envoyées avec l'encodagecontent-length. Sicontent-lengthvaut 0, aucune donnée n'est envoyée.Si
content-lengthest une valeur invalide : Fetch envoie toutes les données du corps en utilisant l'encodage par morceaux.
-
Exemple
Fetch décompresse le contenu automatiquement. L'en-tête de réponse
content-lengthreflète toujours la taille avant décompression. Si vous modifiez le corps avant de le transférer, vérifiez quecontent-lengthcorrespond à la taille réelle du corps. Une incompatibilité decontent-lengthentraîne une diffusion incorrecte du contenu.Dans cet exemple, un client envoie une requête POST avec un en-tête
content-length. Si vous créez une nouvelle requête Fetch en réutilisant les en-têtes du client,content-lengthrisque de ne pas correspondre à la nouvelle taille du corps. Vérifiez toujours la taille du corps lors du transfert des en-têtes.export default { fetch(request) { return handleRequest(request) } } async function handleRequest(request) { return fetch("http://www.example.com", { headers: request.headers, method: request.method, body: "SomeData" }); }
Headers
-
Définition
Pour plus d'informations sur l'objet Headers, consultez Headers.
-
Limites
Un en-tête consomme des ressources mémoire. La taille maximale d'un objet Headers est de 8 Ko. Le dépassement de cette limite lève une exception JavaScript.
-
Liste de blocage
La Fetch API utilise une liste de blocage d'en-têtes. Toute tentative de lecture ou d'écriture d'un en-tête figurant dans cette liste lève une exception. Le tableau suivant décrit les en-têtes inclus dans la liste de blocage.
expect
te
trailer
upgrade
proxy-connection
connection
keep-alive
dnt
host
En-têtes réservés
Request
-
Définition
Suit la spécification MDN Request.
-
Limites
Les propriétés Request suivantes ne sont pas prises en charge dans CDN, DCDN ou ESA.
context
credentials
destination
integrity
mode
referrer
referrerPolicy
cache
-
Cas d'utilisation courants
Récupérer la méthode de requête :
request.method.Récupérer l'URL de requête :
request.url.Récupérer les en-têtes de requête :
request.headers.Récupérer la charge utile de requête :
request.body. Le corps est un objet ReadableStream.Récupérer du JSON :
await request.json().Récupérer des données de formulaire :
await request.formData().Récupérer une chaîne UTF-8 :
await request.text().
Extension non standard,
request.ignorevide le flux du corps au niveau du socket sans le charger dans la mémoire de la machine virtuelle JavaScript, évitant ainsi les délais liés au ramasse-miettes. Appelezawait request.ignore()lorsque vous n'avez pas besoin du corps de la requête. L'environnement d'exécution remet la connexion dans le pool une fois le corps entièrement lu.
Response
-
Définition
Suit la spécification MDN Response.
-
Limites
Les propriétés useFinalURLS et error ne sont pas prises en charge dans CDN, DCDN ou ESA.
-
Cas d'utilisation courants
Récupérer le code de réponse :
response.status.Récupérer le texte de raison de la réponse :
response.statusText.Récupérer les en-têtes de réponse :
response.headers.Récupérer l'URL de réponse :
response.url. Il s'agit de l'URL finale après toutes les redirections.Récupérer toutes les URL de redirection (non standard) :
response.urlList. Response implémente un mixin de corps similaire à Request ; les mêmes méthodes de récupération du corps s'appliquent donc.
FormData
-
Définition
Pour plus d'informations sur l'opération FormData, consultez FormData.
-
Limites
L'opération FormData est similaire à l'opération Headers. FormData limite la taille des en-têtes. Le dépassement de cette limite lève une exception. Si vous envoyez FormData en tant que corps de requête HTTP,
content-typeest défini surform-data/multipartpar défaut.
URLSearchParams
-
Définition
Pour plus d'informations sur l'opération URLSearchParams, consultez URLSearchParams().
-
Limites
Si vous envoyez URLSearchParams en tant que corps de requête HTTP,
content-typeest défini surapplication/x-www-form-urlencodepar défaut. La taille des données ne peut pas dépasser 1 000 octets.
Blob et File
-
Définition
-
Limites
ER prend en charge les classes Blob et File, conformes aux standards des opérations Blob et File. ER ne peut ni lire ni écrire de fichiers. Vous pouvez passer les classes Blob et File prises en charge par ER au corps de réponse. La valeur de l'en-tête
content-typecorrespond au type MIME de l'opérationBlobouFile.