Zum Inhalt springen

WHATWG Fetch

Blob, File, Headers, FormData, Bodys, Anfragen, Antworten und fetch.

Auf dieser Seite

Elide stellt Blob, File, Headers, FormData, Request, Response und fetch als Globals bereit.

Blob und 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

Zu den Lesemethoden von Blob gehören text(), arrayBuffer(), bytes() und stream(). slice() gibt einen Blob zurück. File ergänzt name und 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"]

Namen beachten keine Groß- und Kleinschreibung. Die Iteration schreibt Namen klein und sortiert sie, fasst die meisten doppelten Werte zusammen und hält Werte von Set-Cookie getrennt. Ungültige Namen oder Werte werfen TypeError. Guards für Request, Response, No-CORS und Unveränderlichkeit schränken Änderungen ein, wo zutreffend.

FormData

FormData ist eine Liste von String- oder File-Werten in Einfügereihenfolge.

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"

Ein Blob wird beim Anhängen zu einem File normalisiert. set() ersetzt den ersten passenden Eintrag und entfernt spätere Duplikate.

Bodys von Request und Response

Beide Klassen stellen body, bodyUsed, arrayBuffer(), blob(), bytes(), formData(), json() und text() bereit.

Unterstützte Body-Eingaben sind Zeichenketten, Blobs, Buffer-Quellen, FormData, URLSearchParams und ReadableStream. GET- und HEAD-Anfragen lehnen einen Body ungleich null ab. Ein Stream als Anfrage-Body erfordert 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 }

Anfrage-URLs müssen absolut sein. Statuscodes im Response-Konstruktor sind auf 200–599 beschränkt. Response.redirect() erfordert ebenfalls eine absolute URL. Response.error(), Response.redirect(), Response.json() und clone() sind verfügbar.

fetch

fetch(input, init?) akzeptiert eine URL, eine URL-Zeichenkette oder einen Request und gibt ein Promise zurück, das aufgelöst wird, wenn die Antwort-Header eintreffen. Der Antwort-Body ist ein ReadableStream: Chunks stehen zur Verfügung, bevor der Server das Senden der Antwort abgeschlossen hat. Methoden wie response.text() konsumieren den Stream vollständig.

Anfrage-Bodys können ebenfalls Streams sein. Das Abbrechen eines Antwort-Bodys schließt seinen Netzwerk-Stream; ein AbortSignal kann das Absenden oder spätere Lesevorgänge des Bodys abbrechen. Redirect-Modi und Integritätsmetadaten werden beim Absenden angewendet. Die Integritätsprüfung puffert bis zu 100 MiB und wird abgeschlossen, bevor die Antwort bereitgestellt wird.

Gzip- und Deflate-Antworten werden einmal dekodiert, wobei ihre Antwort-Header erhalten bleiben. HTTPS prüft standardmäßig Zertifikatsketten und Hostnamen; zusätzliche Vertrauenskonfiguration ist unter Laufzeit-Umgebungsvariablen aufgeführt.

fetch spricht HTTP/1.1 und HTTP/2 über den nativen Transport von Elide. Mit elide info untersuchen Sie den gewählten Transport und TLS-Provider. Vom ProxySelector des Hosts gewählte HTTP-Proxys werden unterstützt, einschließlich HTTPS CONNECT. Authentifizierte Proxys und nicht unterstützte Proxy-Typen schlagen explizit fehl.

Die Komprimierung ist separat unter Compression Streams beschrieben. Optionen und Lebenszyklus des HTTP-Servers gehören zur Referenz zum Elide-Global.

HTTP-Standardwerte und Komprimierung

Fetch sendet User-Agent: Elide/<version> und Accept: */*. Überschreiben Sie beides mit gewöhnlichen Anfrage-Headern:

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

Setzen Sie ELIDE_HTTP_USER_AGENT, um den Standard des Prozesses zu ändern. JVM-Einbettungen können die Systemeigenschaft elide.http.userAgent verwenden; sie hat Vorrang vor der Umgebung. Ein Header pro Anfrage hat Vorrang vor beiden Einstellungen. Konfigurierte Werte müssen druckbares ASCII sein.

Fetch kündigt gzip, deflate, Brotli und Zstandard an und dekodiert sie mit den verfügbaren Codecs der Laufzeitumgebung. Der reine JDK-Rückfall für die Komprimierung kündigt gzip und deflate an. Explizite Accept-Encoding-Header bleiben erhalten. Range-Anfragen verwenden standardmäßig identity. Antwort-Header beschreiben die kodierte Antwort auch nach der Dekodierung des Bodys.

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

Mit decompress: false ist das standardmäßige Accept-Encoding gleich identity; ein Server, der trotzdem komprimierten Inhalt sendet, wird unverändert zurückgegeben. Das ist nützlich, wenn kodierte Antworten durchgereicht werden. Ansonsten bleibt die automatische Dekodierung streamend und lehnt fehlerhafte komprimierte Bodys ab.

Bedingte Header wie If-None-Match und If-Modified-Since werden normal gesendet. Eine 304-Antwort behält ihre Header und hat keinen Body; fetch unterhält keinen HTTP-Cache im Stil eines Browsers.

Beim Bereitstellen bleiben kodierte Antworten unter Kontrolle der Anwendung: Senden Sie den kodierten Body mit seinem Content-Encoding und verwenden Sie Vary: Accept-Encoding, wenn Sie Repräsentationen aushandeln. Elide komprimiert Antwort-Bodys nicht stillschweigend neu.

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.

War diese Seite hilfreich?