← Cloudflare Workers / workers / runtime-apis
Fetch
Fetch API ↗ предоставляет интерфейс для асинхронного получения ресурсов через HTTP запросы внутри Worker.
Синтаксис
export default {
async scheduled(controller, env, ctx) {
return await fetch("https://example.com", {
headers: {
"X-Source": "Cloudflare-Workers",
},
});
},
};addEventListener("fetch", (event) => {
// NOTE: can’t use fetch here, as we’re not in an async scope yet
event.respondWith(eventHandler(event));
});
async function eventHandler(event) {
// fetch can be awaited here since `event.respondWith()` waits for the Promise it receives to settle
const resp = await fetch(event.request);
return resp;
}from workers import WorkerEntrypoint, Response, fetch
class Default(WorkerEntrypoint):
async def scheduled(self, controller, env, ctx):
return await fetch("https://example.com", headers={"X-Source": "Cloudflare-Workers"})fetch(resource, options optional): Promise<Response>- Fetch возвращает Promise с объектом Response.
Параметры
-
resource↗ Request | string | URL -
optionsпараметрыcacheundefined | 'no-store' | 'no-cache'необязательный- Стандартный HTTP
cacheзаголовок. Толькоcache: 'no-store'иcache: 'no-cache'поддерживаются. Любой другойcacheзаголовка приведёт кTypeErrorс сообщениемUnsupported cache mode: <attempted-cache-mode>. _ Для всех запросов это пересылаетPragma: no-cacheиCache-Control: no-cacheзаголовки на origin. _ Дляno-store, запросы к источникам, не размещённым на Cloudflare, не используют кеши Cloudflare. _ Дляno-cache, запросы к источникам, не размещённым на Cloudflare, вынуждены проходить повторную проверку у источника перед ответом.
- Стандартный HTTP
- Объект, определяющий содержимое и поведение запроса.
Как Accept-Encoding заголовок обрабатывается
При выполнении подзапроса с fetch() API можно указать предпочтительные формы сжатия, с которыми должен отвечать сервер (если он их поддерживает), включив Accept-Encoding ↗ заголовок.
Workers поддерживает алгоритмы сжатия gzip и brotli. Обычно указывать Accept-Encoding или Content-Encoding заголовки в продакшен среде Workers Runtime: сжатие brotli или gzip запрашивается автоматически при получении данных с origin сервера и применяется к ответу при возврате данных клиенту, в зависимости от возможностей клиента и origin сервера.
Чтобы поддерживать запрос brotli к источнику, необходимо включить brotli_content_encoding флаг совместимости в Worker. Скоро этот флаг совместимости будет включён по умолчанию для всех Workers начиная с определённой даты совместимости.
Поведение сквозной передачи
Один из сценариев, где заголовок Accept-Encoding полезен, это передача сжатых данных от сервера к клиенту без изменений, когда Accept-Encoding позволяет worker получать сжатый поток данных от сервера напрямую, без предварительного разжатия. Пока тело сжатого ответа не считывается перед возвратом его клиенту и сохраняется Content-Encoding заголовок без изменений, он будет «проходить насквозь» без распаковки и повторного сжатия. Это может быть полезно, если Workers используется перед исходными серверами или при получении сжатых медиафайлов, чтобы гарантировать, что в ответе, который возвращает ваш Worker, используется то же сжатие, что и на исходном сервере.
Повторное сжатие требуется не только при изменении кодировки содержимого, но и когда ответ использует кодировку, не поддерживаемую клиентом. Например, если Worker запрашивает кодировку brotli или gzip, а клиент поддерживает только gzip, повторное сжатие всё равно потребуется, если сервер вернёт данные в кодировке brotli (оно будет применено автоматически). Учтите, что это поведение может также зависеть от правила сжатия, с помощью которого можно настроить, какое сжатие применять к разным типам данных на стороне сервера.
export default {
async fetch(request) {
// Accept brotli or gzip compression
const headers = new Headers({
"Accept-Encoding": "br, gzip",
});
let response = await fetch("https://developers.cloudflare.com", {
method: "GET",
headers,
});
// As long as the original response body is returned and the Content-Encoding header is
// preserved, the same encoded data will be returned without needing to be compressed again.
return new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers: response.headers,
});
},
};Дополнительные материалы
- Пример: использование
fetchчтобы ответить другим сайтом - Пример: получение HTML через fetch
- Пример: получение JSON через fetch
- Пример: кеширование с использованием Fetch
- Напишите код своего Worker на синтаксис ES modules для оптимальной работы.
- Ошибка 526
- Fetch API в частичной настройке