Перейти к содержимому

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 отклоняют непустое тело. Потоковое тело запроса требует 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 МиБ и завершается до того, как ответ станет доступен.

Ответы 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.

Была ли эта страница полезной?