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; // trueLes 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
| Export | Kind | Status | Notes |
|---|---|---|---|
Headers | class | Full | append(), delete(), get(), getSetCookie(), has(), set(), iteration |
Request | class | Full | method, url, headers, destination, referrer, referrerPolicy, mode, credentials, cache, redirect, integrity, keepalive, signal, duplex, clone(), body, bodyUsed, arrayBuffer(), blob(), bytes(), formData(), json(), text() |
Response | class | Full | Response.error(), Response.redirect(), Response.json(), type, url, redirected, status, ok, statusText, headers, clone(), body, bodyUsed, arrayBuffer(), blob(), bytes(), formData(), json(), text() |
Blob | class | Full | size, type, slice(), text(), arrayBuffer(), bytes(), stream() |
File | class | Full | name, lastModified |
FormData | class | Full | append(), 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.