Перейти до вмісту

WHATWG Fetch

Blob, File, Headers, FormData, тіла, запити, відповіді та fetch.

На цій сторінці

Elide надає Blob, File, Headers, FormData, Request, Response і fetch як глобальні об’єкти.

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

Методи читання Blob: text(), arrayBuffer(), bytes() і stream(). slice() повертає Blob. File додає name і 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"]

Імена не чутливі до регістру. Ітерація переводить імена в нижній регістр і сортує їх, об’єднує більшість дублікатів значень і тримає значення Set-Cookie окремо. Некоректні імена чи значення кидають TypeError. Захисти request, response, no-CORS та immutable обмежують зміни, де це застосовно.

FormData

FormData — список рядкових значень або значень 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"

Blob під час додавання нормалізується до File. set() замінює перший відповідний запис і вилучає пізніші дублікати.

Тіла Request і Response

Обидва класи надають body, bodyUsed, arrayBuffer(), blob(), bytes(), formData(), json() і text().

Підтримувані вхідні дані для тіла: рядки, blob, джерела буферів, FormData, URLSearchParams і ReadableStream. Запити GET і HEAD відхиляють тіло, відмінне від null. Потокове тіло запиту потребує 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 }

URL запитів мають бути абсолютними. Статуси в конструкторі Response обмежено діапазоном 200–599. Response.redirect() також потребує абсолютного URL. Доступні Response.error(), Response.redirect(), Response.json() і clone().

fetch

fetch(input, init?) приймає URL, рядок URL або Request і повертає Promise, що розв’язується з надходженням заголовків відповіді. Тіло відповіді є ReadableStream: фрагменти стають доступними до того, як сервер завершить надсилання відповіді. Методи на кшталт response.text() споживають потік до кінця.

Тіла запитів також можуть бути потоками. Скасування тіла відповіді закриває його мережевий потік; AbortSignal може скасувати надсилання або подальше читання тіла. Режими перенаправлення та метадані цілісності застосовуються під час надсилання. Перевірка цілісності буферизує до 100 MiB і завершується до того, як відповідь стане доступною.

Відповіді gzip і deflate декодуються один раз зі збереженням заголовків відповіді. HTTPS за замовчуванням перевіряє ланцюжки сертифікатів та імена хостів; додаткові налаштування довіри наведено в розділі Змінні оточення середовища виконання.

fetch працює за HTTP/1.1 і HTTP/2 на нативному транспорті Elide. Використовуйте elide info, щоб переглянути вибраний транспорт і постачальника TLS. Підтримуються HTTP-проксі, які вибирає ProxySelector хоста, включно з HTTPS CONNECT. Проксі з автентифікацією та непідтримувані типи проксі явно завершуються помилкою.

Стиснення описано окремо в розділі Потоки стиснення. Параметри та життєвий цикл HTTP-сервера описано в довіднику глобального об’єкта Elide.

Типові налаштування HTTP і стиснення

Fetch надсилає User-Agent: Elide/<version> і Accept: */*. Будь-який із них можна перевизначити звичайними заголовками запиту:

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

Встановіть ELIDE_HTTP_USER_AGENT, щоб змінити значення за замовчуванням для процесу. Застосунки, що вбудовують JVM, можуть використовувати системну властивість elide.http.userAgent; вона має пріоритет над змінною оточення. Заголовок окремого запиту має пріоритет над обома налаштуваннями. Налаштовані значення мають бути друкованими символами ASCII.

Fetch оголошує й декодує gzip, deflate, Brotli і Zstandard за допомогою доступних кодеків середовища виконання. Запасний варіант стиснення лише на JDK оголошує gzip і deflate. Явні заголовки Accept-Encoding зберігаються. Запити діапазонів за замовчуванням використовують identity. Заголовки відповіді описують закодовану відповідь навіть після декодування тіла.

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

З decompress: false типовий Accept-Encoding — identity; якщо сервер усе одно надсилає стиснений вміст, він повертається без змін. Це корисно під час проксіювання закодованих відповідей. В інших випадках автоматичне декодування залишається потоковим і відхиляє пошкоджені стиснені тіла.

Умовні заголовки, як-от If-None-Match і If-Modified-Since, надсилаються звичайним чином. Відповідь 304 зберігає свої заголовки й не має тіла; fetch не підтримує HTTP-кешу в стилі браузера.

Під час віддачі закодовані відповіді залишаються під контролем застосунку: надсилайте закодоване тіло з його Content-Encoding і використовуйте Vary: Accept-Encoding під час узгодження подань. Elide не стискає тіла відповідей повторно без вашого відома.

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.

Чи була ця сторінка корисною?