Aller au contenu

WHATWG Fetch

Blob, File, Headers, FormData, corps, requêtes, réponses et fetch.

Sur cette page

Elide expose Blob, File, Headers, FormData, Request, Response et fetch sous forme de globales.

Blob et File

const blob = new Blob(["hello"]);
await blob.text(); // "hello"
await blob.bytes(); // Uint8Array(5)

const file = new File(["hello"], "greeting.txt", {
  type: "text/plain",
  lastModified: 1700000000000,
});
file instanceof Blob; // true

Les lecteurs de Blob comprennent text(), arrayBuffer(), bytes() et stream(). slice() renvoie un Blob. File ajoute name et lastModified.

Headers

const headers = new Headers([["X-Custom", "1"]]);
headers.append("X-Custom", "2");
headers.get("x-custom"); // "1, 2"

headers.append("Set-Cookie", "a=1");
headers.getSetCookie(); // ["a=1"]

Les noms sont insensibles à la casse. L’itération met les noms en minuscules et les trie, combine la plupart des valeurs en double et garde les valeurs Set-Cookie séparées. Les noms ou valeurs invalides lèvent une TypeError. Les gardes request, response, no-CORS et immutable restreignent les modifications lorsque c’est applicable.

FormData

FormData est une liste, ordonnée par insertion, de valeurs chaîne ou File.

const form = new FormData();
form.append("tag", "first");
form.append("tag", "second");
form.getAll("tag"); // ["first", "second"]

form.append("upload", new Blob(["hello"], { type: "text/plain" }));
form.get("upload").name; // "blob"

Un Blob est normalisé en File lorsqu’il est ajouté. set() remplace la première entrée correspondante et supprime les doublons suivants.

Corps de Request et de Response

Les deux classes exposent body, bodyUsed, arrayBuffer(), blob(), bytes(), formData(), json() et text().

Les entrées de corps prises en charge comprennent les chaînes, les blobs, les sources de tampon, FormData, URLSearchParams et ReadableStream. Les requêtes GET et HEAD rejettent un corps non nul. Un corps de requête sous forme de flux nécessite duplex: "half".

const request = new Request("https://example.invalid/", {
  method: "POST",
  body: "hello",
});
await request.text(); // "hello"

const response = Response.json({ ok: true });
await response.json(); // { ok: true }

Les URL des requêtes doivent être absolues. Les codes d’état du constructeur de Response sont limités à 200–599. Response.redirect() exige aussi une URL absolue. Response.error(), Response.redirect(), Response.json() et clone() sont disponibles.

fetch

fetch(input, init?) accepte une URL, une chaîne d’URL ou une Request et renvoie une Promise qui se résout à l’arrivée des en-têtes de la réponse. Le corps de la réponse est un ReadableStream : les fragments deviennent disponibles avant que le serveur ait fini d’envoyer la réponse. Les méthodes telles que response.text() consomment le flux jusqu’au bout.

Les corps de requête peuvent aussi être des flux. Annuler un corps de réponse ferme son flux réseau ; un AbortSignal peut annuler l’envoi ou les lectures ultérieures du corps. Les modes de redirection et les métadonnées d’intégrité sont appliqués pendant l’envoi. La vérification d’intégrité met en tampon jusqu’à 100 Mio et se termine avant d’exposer la réponse.

Les réponses gzip et deflate sont décodées une seule fois tout en conservant leurs en-têtes de réponse. HTTPS valide par défaut les chaînes de certificats et les noms d’hôte ; la configuration de confiance supplémentaire est décrite dans Variables d’environnement d’exécution.

fetch parle HTTP/1.1 et HTTP/2 sur le transport natif d’Elide. Utilisez elide info pour inspecter le transport et le fournisseur TLS sélectionnés. Les proxys HTTP sélectionnés par le ProxySelector de l’hôte sont pris en charge, y compris HTTPS CONNECT. Les proxys authentifiés et les types de proxy non pris en charge échouent explicitement.

La compression est documentée séparément dans Compression Streams. Les options et le cycle de vie du serveur HTTP relèvent de la référence du global Elide.

Valeurs HTTP par défaut et compression

Fetch envoie User-Agent: Elide/<version> et Accept: */*. Remplacez l’une ou l’autre avec des en-têtes de requête ordinaires :

await fetch(url, { headers: { "User-Agent": "my-service/1.0" } });

Définissez ELIDE_HTTP_USER_AGENT pour changer la valeur par défaut du processus. Les intégrateurs JVM peuvent utiliser la propriété système elide.http.userAgent ; elle est prioritaire sur l’environnement. Un en-tête par requête est prioritaire sur l’un comme l’autre réglage. Les valeurs configurées doivent être en ASCII imprimable.

Fetch annonce et décode gzip, deflate, Brotli et Zstandard à l’aide des codecs disponibles dans l’environnement d’exécution. La solution de repli de compression reposant uniquement sur le JDK annonce gzip et deflate. Les en-têtes Accept-Encoding explicites sont préservés. Les requêtes de plage utilisent identity par défaut. Les en-têtes de réponse décrivent la réponse encodée, même après le décodage du corps.

const response = await fetch(url, { decompress: false });
const encodedBytes = await response.arrayBuffer();

Avec decompress: false, l’Accept-Encoding par défaut est identity ; un serveur qui envoie malgré tout du contenu compressé le voit renvoyé tel quel. C’est utile pour relayer des réponses encodées via un proxy. Sinon, le décodage automatique reste en streaming et rejette les corps compressés malformés.

Les en-têtes conditionnels tels que If-None-Match et If-Modified-Since sont envoyés normalement. Une réponse 304 conserve ses en-têtes et n’a pas de corps ; fetch ne maintient pas de cache HTTP à la manière d’un navigateur.

Côté service, les réponses encodées restent sous le contrôle de l’application : envoyez le corps encodé avec son Content-Encoding, et utilisez Vary: Accept-Encoding lorsque vous négociez des représentations. Elide ne recompresse jamais silencieusement les corps de réponse.

Reference

Status: Full · 1,455 of 2,511 suite tests pass (57.9%) · since 1.1.0

Exports

ExportKindStatusNotes
HeadersclassFullappend(), delete(), get(), getSetCookie(), has(), set(), iteration
RequestclassFullmethod, url, headers, destination, referrer, referrerPolicy, mode, credentials, cache, redirect, integrity, keepalive, signal, duplex, clone(), body, bodyUsed, arrayBuffer(), blob(), bytes(), formData(), json(), text()
ResponseclassFullResponse.error(), Response.redirect(), Response.json(), type, url, redirected, status, ok, statusText, headers, clone(), body, bodyUsed, arrayBuffer(), blob(), bytes(), formData(), json(), text()
BlobclassFullsize, type, slice(), text(), arrayBuffer(), bytes(), stream()
FileclassFullname, lastModified
FormDataclassFullappend(), delete(), get(), getAll(), has(), set(), iteration

Tests: wpt-wintertc fetch: 1,455 pass, 1,043 fail, 13 error, 400 skipped. Failing: fetch/api/basic/request-forbidden-headers.any.js (96), fetch/api/redirect/redirect-referrer-override.any.js (91), fetch/data-urls/processing.any.js (68), fetch/api/headers/header-values-normalize.any.js (57), fetch/api/cors/cors-keepalive.any.js (51), fetch/api/cors/cors-preflight-star.any.js (34), fetch/api/redirect/redirect-origin.any.js (30), fetch/api/cors/cors-preflight-status.any.js (27), and 110 more.

Cette page vous a-t-elle aidé ?