Récupérez des données depuis les points de présence (POP) Edge via HTTP ou HTTPS. L'API Fetch fonctionne comme l'API Fetch des navigateurs et prend en charge le chargement dynamique du contenu, l'interaction avec le backend et 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 concurrentes. Les connexions persistantes sont gérées 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 de redirect par requête.
-
Définition de la méthode
fetch(arg, init). La méthode suit la spécification MDN WorkerOrGlobalScope.fetch(). -
Limites de la méthode
L'API Fetch prend uniquement en charge les noms de domaine, et non les adresses IP. Ports par défaut : 80 (HTTP), 443 (HTTPS).
Les propriétés
credentials,referrer,referrerPolicy,cacheetintegritydu paramètreinitn'ont aucun effet.redirectest défini par défaut surfollow, ce qui suit les réponses 3xx provenant 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 fetchpeut récupérer des données depuis n'importe quelle origine.La longueur totale d'une URL de requête ne peut pas dépasser 4 Ko.
Les ressources compressées en gzip récupérées sont décompressées par défaut. Ajoutez le paramètre
manualpour désactiver la décompression. La section Décompression couvre les détails.
-
Définir une période de délai d'attente
-
Fonction de délai d'attente
/** * 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 générée pour les réponses 3xx.{redirect: "follow"}: (Par défaut) Suit les redirections 3xx. Un maximum de 20 redirections peut être suivi.
Comportement de redirection par code d'état :
|
Code d'état |
Détails de la redirection |
|
301, 302, 303, 308 |
La méthode de requête est changée en 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 l'en-tête Location 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 une URL relative.
Décompression
L'API Fetch vous permet de configurer un mode de décompression, tel que fetch("https://www.example.com",{decompress: "manual"}). Le paramètre decompress prend en charge 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) sont également compressées.
-
decompress : décompresse automatiquement les données. Il s'agit de la valeur par défaut. L'API Fetch prend en charge la compression Gzip. ER détecte ou décompresse automatiquement les données en fonction de l'en-tête Content-Encoding. Après la décompression des données par ER, ER modifie la valeur de Content-Encoding. Si le paramètre Gzip est supprimé, vous pouvez configurer 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 la valeur decompress. Si ER ne peut pas reconnaître cette valeur, ER ne décompresse pas les données.
Après la décompression automatique des données par l'API Fetch, vous ne pouvez pas transmettre l'en-tête Content-Length selon vos besoins si la réponse contient l'en-tête Content-Length. En effet, l'en-tête 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 chunked.
-
Paramètres de
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 en utilisant l'encodagecontent-length. Sicontent-lengthest égal à 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 chunked.
-
Exemple
Fetch décompresse le contenu automatiquement. L'en-tête
content-lengthde la réponse reflè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 livraison 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, lecontent-lengthpeut 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 enregistre la quantité de ressources mémoire consommées. La taille maximale d'un objet Headers est de 8 Ko. Si la taille d'un objet Headers dépasse cette limite, une exception JavaScript est levée.
-
Liste noire
L'API Fetch utilise une liste noire d'en-têtes. Si vous tentez de lire ou d'écrire un en-tête figurant dans la liste noire, une exception est levée. Le tableau suivant décrit les en-têtes inclus dans la liste noire.
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 sur CDN, DCDN ou ESA.
context
credentials
destination
integrity
mode
referrer
referrerPolicy
cache
-
Utilisations courantes
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 la requête :
request.body. Le corps est un objet ReadableStream.Récupérer JSON :
await request.json().Récupérer les données de formulaire :
await request.formData().Récupérer une chaîne UTF-8 :
await request.text().
En tant qu'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 retards du garbage collector (GC). Appelezawait request.ignore()lorsque vous n'avez pas besoin du corps de la requête. Le runtime renvoie la connexion au pool après la lecture complète du corps.
Response
-
Définition
Suit la spécification MDN Response.
-
Limites
Les propriétés useFinalURLS et error ne sont pas prises en charge sur CDN, DCDN ou ESA.
-
Utilisations courantes
Récupérer le code de réponse :
response.status.Récupérer la phrase 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 comme Request, donc les mêmes méthodes de récupération du corps s'appliquent.
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. Si la taille d'un en-tête dépasse la limite supérieure, une exception est levée. Si vous envoyez FormData en tant que corps de requête HTTP,
content-typeest défini par défaut surform-data/multipart.
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 par défaut surapplication/x-www-form-urlencode. 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, qui respectent les normes des opérations Blob et File. ER ne peut ni lire ni écrire de fichiers. Vous pouvez transmettre les classes Blob et File prises en charge par ER au corps de la réponse. La valeur de l'en-tête
content-typeest identique au type MIME dans l'opérationBlobouFile.