← Cloudflare Workers / workers / runtime-apis
Запрос
Request ↗ интерфейс представляет HTTP-запрос и является частью Fetch API.
Контекст
Чаще всего вы столкнетесь с Request объект доступен как свойство входящего запроса:
export default {
async fetch(request, env, ctx) {
return new Response('Hello World!');
},
};Возможно, вы также захотите создать Request самостоятельно, если нужно изменить объект запроса, потому что входящий request параметр, который вы получаете из fetch() обработчик является неизменяемым.
export default {
async fetch(request, env, ctx) {
const url = "https://example.com";
const modifiedRequest = new Request(url, request);
// ...
},
}; fetch() handler вызывает Request конструктор. RequestInit и RequestInitCfProperties типы, определенные ниже, также описывают допустимые параметры, которые можно передать в fetch() handler.
Конструктор
let request = new Request(input, options)Параметры
-
inputstring | Request- Либо строка, содержащая URL, либо существующий
Requestобъект.
- Либо строка, содержащая URL, либо существующий
-
optionsопции необязательны- Необязательный объект параметров, содержащий настройки, которые применяются к
Request.
- Необязательный объект параметров, содержащий настройки, которые применяются к
options
Объект, содержащий свойства, которые нужно применить к запросу.
-
cacheundefined | 'no-store' | 'no-cache'необязательный- Стандартный HTTP
cacheзаголовок. Толькоcache: 'no-store'иcache: 'no-cache'поддерживаются. Любой другой заголовок кеша приведёт кTypeErrorс сообщениемUnsupported cache mode: <attempted-cache-mode>.
- Стандартный HTTP
-
cfRequestInitCfProperties необязательно- Специфичные для Cloudflare свойства, которые можно задать в
Requestкоторые определяют, как глобальная сеть Cloudflare обрабатывает запрос.
- Специфичные для Cloudflare свойства, которые можно задать в
-
methodstringнеобязательно- Метод HTTP-запроса. Значение по умолчанию:
GET. В Workers все Методы HTTP-запросов ↗ поддерживаются, за исключениемCONNECT↗.
- Метод HTTP-запроса. Значение по умолчанию:
-
headersHeaders необязательно -
bodystring | ReadableStream | FormData | URLSearchParams необязательно- Тело запроса, если оно есть.
- Обратите внимание, что запрос с методом GET или HEAD не может содержать тело.
-
redirectstringнеобязательно- Используемый режим перенаправления:
follow,error, илиmanual. Значение по умолчанию для новогоRequestобъект представляет собойfollow. Обратите внимание, однако, что входящийRequestсвойствоFetchEventбудет иметь режим перенаправленияmanual.
- Используемый режим перенаправления:
-
signalAbortSignal необязательно- Если этот параметр указан, запрос можно отменить, вызвав abort у соответствующего
AbortController.
- Если этот параметр указан, запрос можно отменить, вызвав abort у соответствующего
cf свойство (RequestInitCfProperties)
Объект, содержащий специфичные для Cloudflare свойства, которые можно задать в Request объект. Например:
// Disable ScrapeShield for this request.
fetch(event.request, { cf: { scrapeShield: false } })Недопустимые или неправильно названные ключи в cf объект будет молча проигнорирован. Рекомендуем использовать TypeScript и генерировать типы с помощью команды wrangler types чтобы обеспечить правильное использование cf объект.
-
appsbooleanнеобязательно- Указывает, Cloudflare Apps ↗ следует включить для этого запроса. По умолчанию
true.
- Указывает, Cloudflare Apps ↗ следует включить для этого запроса. По умолчанию
-
cacheEverythingbooleanнеобязательно- Обрабатывает весь контент как статический и кеширует весь типы файлов сверх содержимого, кешируемого Cloudflare по умолчанию. Учитывает заголовки кеша от исходного веб-сервера. Это эквивалентно установке Page Rule Cache Level (к Cache Everything). По умолчанию используется
false. Эта опция применяется кGETиHEADметодов запроса, и никаких других.
- Обрабатывает весь контент как статический и кеширует весь типы файлов сверх содержимого, кешируемого Cloudflare по умолчанию. Учитывает заголовки кеша от исходного веб-сервера. Это эквивалентно установке Page Rule Cache Level (к Cache Everything). По умолчанию используется
-
cacheKeystringнеобязательно- Cache key запроса определяет, считаются ли два запроса одинаковыми с точки зрения кэширования. Если у запроса тот же cache key, что и у предыдущего запроса, Cloudflare может отдать для обоих один и тот же закэшированный ответ.
-
cacheTagsArray<string> необязательно- Этот параметр добавляет Cache-Tag заголовки к ответу от origin сервера. Это позволяет выполнять очистку кешированного содержимого по тегам, предоставленным Worker, без изменений на origin сервере. Это выполняется с помощью Очистка по тегу функция.
-
cacheTtlnumberнеобязательно- Этот параметр заставляет Cloudflare кешировать ответ на этот запрос независимо от заголовков, присутствующих в ответе. Это эквивалентно настройке двух Page Rules: Edge Cache TTL и Cache Level (к Cache Everything). Значение должно быть нулём или положительным числом. Значение
0означает, что кешированный ресурс истекает немедленно. Этот параметр применяется кGETиHEADметодов запроса, и никаких других.
- Этот параметр заставляет Cloudflare кешировать ответ на этот запрос независимо от заголовков, присутствующих в ответе. Это эквивалентно настройке двух Page Rules: Edge Cache TTL и Cache Level (к Cache Everything). Значение должно быть нулём или положительным числом. Значение
-
cacheTtlByStatus{ [key: string]: number }необязательный- Этот параметр представляет собой версию
cacheTtlфункция, которая выбирает TTL на основе кода состояния ответа. Если ответ на этот запрос имеет соответствующий код состояния, Cloudflare закэширует его на указанное время и переопределит инструкции кэширования, отправленные источником. Например:{ "200-299": 86400, "404": 1, "500-599": 0 }. Значением может быть любое целое число, включая ноль и отрицательные числа. Значение0означает, что кешированный ресурс истекает немедленно. Любое отрицательное значение указывает Cloudflare вообще не кешировать. Этот параметр применяется кGETиHEADметодов запроса, и никаких других.
- Этот параметр представляет собой версию
-
varyRequestInitCfPropertiesVaryнеобязательно- Управляет тем, как Cloudflare кеширует ответы источника с помощью
Varyзаголовок для одногоfetch()запрос. Если обаcf.varyи Cache Rules Vary применяются,cf.varyимеет приоритет для этого подзапроса.
- Управляет тем, как Cloudflare кеширует ответы источника с помощью
-
imageObject | null необязательно- Включает Image Resizing для этого запроса. Возможные значения описаны в Преобразование изображений с помощью Workers документация.
-
polishstringнеобязательно- Задаёт Polish ↗ режим. Возможные значения:
lossy,losslessилиoff.
- Задаёт Polish ↗ режим. Возможные значения:
-
resolveOverridestringнеобязательно- Направляет запрос на альтернативный исходный сервер, переопределяя DNS-запрос. Значение
resolveOverrideзадаёт альтернативное имя хоста, которое будет использоваться при определении IP-адреса источника вместо имени хоста, указанного в URL.Hostзаголовок запроса будет по-прежнему совпадать с тем, что указано в URL. Таким образом,resolveOverrideпозволяет отправить запрос на сервер, отличный от того, что указан в URL /Hostзаголовок указывает. ОднакоresolveOverrideвступит в силу только в том случае, если хост URL и хост, указанныйresolveOverrideнаходятся в пределах вашей зоны. Если любой из них указывает на хост из другой зоны или домена, эта опция будет проигнорирована из соображений безопасности. Если вам нужно направить запрос на хост за пределами вашей зоны (сохранив при этомHostзаголовок, указывающий на адрес внутри вашей зоны), сначала создайте запись CNAME в своей зоне, указывающую на внешний хост, а затем задайтеresolveOverrideчтобы указывать на запись CNAME. Обратите внимание, что из соображений безопасности невозможно задатьHostзаголовок для указания хоста за пределами вашей зоны, если только запрос действительно не отправляется на этот хост.
- Направляет запрос на альтернативный исходный сервер, переопределяя DNS-запрос. Значение
-
scrapeShieldbooleanнеобязательно- Указывает, ScrapeShield ↗ следует включить для этого запроса, если это настроено для зоны. По умолчанию
true.
- Указывает, ScrapeShield ↗ следует включить для этого запроса, если это настроено для зоны. По умолчанию
-
webpbooleanнеобязательно
cf.vary свойство
cf.vary объект определяет, как Cloudflare обрабатывает заголовки запроса, названные origin сервером Vary заголовок ответа для одного fetch() запрос. Он использует тот же default и headers такую же форму, что и Cache Rules Vary, и то же поведение действий и нормализации, что и Vary.
Если вы не укажете cf.vary, Cloudflare использует другое поведение Vary для зоны, включая Cache Rules Vary, если оно настроено.
Ответ источника должен включать Vary заголовок, чтобы эта настройка повлияла на ключ кэша. Ответ, содержащий Vary: * всегда обходит кеш.
cf.vary объект поддерживает следующие ключи:
| Ключ | Обязательный | Описание |
|---|---|---|
default |
Да | Настройка для любого имени заголовка в источнике Vary ответ, не включенный в headers. |
headers |
Нет | Сопоставление имён заголовков запроса в нижнем регистре с объектами конфигурации. |
Если vary объект присутствует, default обязателен. Пустой vary объект недействителен. Недействительные cf.vary конфигурации игнорируются для этого запроса.
Каждый объект конфигурации заголовка, а также default объект должен включать action с ключом, установленным на одно из normalize, passthrough, или bypass. Дополнительные указания см. в Действия.
Для некоторых имён заголовков можно указать дополнительные параметры:
| Header | Дополнительный ключ | Описание |
|---|---|---|
accept |
media_types |
MIME-типы, которые нужно сохранить при нормализации Accept заголовок. Максимум 10 элементов и 255 символов на элемент. |
accept-language |
languages |
Языки, которые нужно сохранить при нормализации Accept-Language заголовок. Максимум 20 элементов и 64 символа на элемент. |
default объект и headers записи, отличные от accept и accept-language поддерживают только action.
В большинстве развёртываний задайте default.action к bypass, добавьте headers записи для ожидаемого источника Vary заголовки и использовать normalize для accept и accept-language если только вашему источнику не требуются необработанные значения заголовков.
Действуют следующие ограничения и правила проверки:
- Имена заголовков в
headersдолжен быть в нижнем регистре. - Имена заголовков могут содержать строчные буквы, цифры, символы подчёркивания и дефисы.
- Имена заголовков не могут превышать 128 символов.
- Имена заголовков, начинающиеся с
cf-илиcf_не допускаются. - Некоторые заголовки hop-by-hop, cache-control и proxy-control запрещены. Примеры включают
connection,content-length,cache-control,host,range,origin, а такжеx-forwarded-for. headersможет содержать до 50 записей.accept.media_typesможет содержать до 10 записей.accept-language.languagesможет содержать до 20 записей.- Значения в
media_typesиlanguagesдолжны быть непустыми строками из печатаемых символов ASCII.
Следующий фрагмент request init нормализует Accept и Accept-Language, и обходит кеш для любого другого заголовка в источнике Vary ответ:
{
"cf": {
"vary": {
"default": {
"action": "bypass"
},
"headers": {
"accept": {
"action": "normalize",
"media_types": ["text/html", "application/json"]
},
"accept-language": {
"action": "normalize",
"languages": ["en", "fr", "de"]
}
}
}
}
}Свойства
Все свойства входящего Request объект (запрос, который вы получаете от fetch() обработчик) доступны только для чтения. Чтобы изменить свойства входящего запроса, создайте новый Request объект и передаёт параметры для изменения в его конструктор.
-
bodyReadableStream только для чтения- Поток содержимого тела.
-
bodyUsedBoolean только для чтения- Указывает, было ли уже использовано тело ответа.
-
cfIncomingRequestCfProperties только для чтения- Объект, содержащий свойства входящего запроса, предоставляемые глобальной сетью Cloudflare.
- Это свойство доступно только для чтения (если оно не создано на основе существующего
Request). Чтобы изменить его значения, передайте новые значения вcfключinitаргумент параметров при создании новогоRequestобъект.
-
headersHeaders только для чтения-
По сравнению с браузерами Cloudflare Workers накладывает гораздо меньше ограничений на то, какие заголовки можно отправлять. Например, браузер не позволяет задать заголовок
Cookieзаголовок, поскольку браузер сам отвечает за обработку cookie. Workers же не имеет особого понимания cookie и обрабатываетCookieзаголовок, как и любой другой заголовок.
-
methodстрока только для чтения- Содержит метод запроса, например,
GET,POST, и т. д.
- Содержит метод запроса, например,
-
redirectстрока только для чтения- Используемый режим перенаправления:
follow,error, илиmanual.fetchметод автоматически будет следовать редиректам, если режим редиректа установлен вfollow. Если установлено значениеmanual,3xxответ с перенаправлением будет возвращён вызывающей стороне без изменений. Значение по умолчанию для новогоRequestобъект представляет собойfollow. Обратите внимание, однако, что входящийRequestсвойствоFetchEventбудет иметь режим перенаправленияmanual.
- Используемый режим перенаправления:
-
signalAbortSignal только для чтения-
AbortSignalсоответствующий этому запросу. Если вы используетеenable_request_signalфлаг совместимости, можно подключить обработчик события к сигналу. Это позволяет выполнить завершающие задачи или записать данные в логи до окончания вызова Worker. Например, если запустить Worker ниже и затем прервать запрос со стороны клиента, будет записан лог:index.jsexport default { async fetch(request, env, ctx) { // This sets up an event listener that will be called if the client disconnects from your // worker. request.signal.addEventListener("abort", () => { console.log("The request was aborted!"); }); const { readable, writable } = new IdentityTransformStream(); sendPing(writable); return new Response(readable, { headers: { "Content-Type": "text/plain" }, }); }, }; async function sendPing(writable) { const writer = writable.getWriter(); const enc = new TextEncoder(); for (;;) { // Send 'ping' every second to keep the connection alive await writer.write(enc.encode("ping\r\n")); await scheduler.wait(1000); } }index.tsexport default { async fetch(request, env, ctx): Promise<Response> { // This sets up an event listener that will be called if the client disconnects from your // worker. request.signal.addEventListener('abort', () => { console.log('The request was aborted!'); }); const { readable, writable } = new IdentityTransformStream(); sendPing(writable); return new Response(readable, { headers: { 'Content-Type': 'text/plain' } }); }, } satisfies ExportedHandler<Env>; async function sendPing(writable: WritableStream): Promise<void> { const writer = writable.getWriter(); const enc = new TextEncoder(); for (;;) { // Send 'ping' every second to keep the connection alive await writer.write(enc.encode('ping\r\n')); await scheduler.wait(1000); } }
-
-
urlстрока только для чтения- Содержит URL запроса.
IncomingRequestCfProperties
Помимо свойств стандартного Request ↗ объект, request.cf объект во входящем Request содержит сведения о запросе, предоставленные глобальной сетью Cloudflare.
На всех тарифных планах доступно:
-
asnNumber- ASN входящего запроса, например,
395747.
- ASN входящего запроса, например,
-
asOrganizationстрока- Организация, которой принадлежит ASN входящего запроса, например,
Google Cloud.
- Организация, которой принадлежит ASN входящего запроса, например,
-
botManagementObject | null- Задается только при использовании Cloudflare Bot Management. Объект со следующими свойствами:
score,verifiedBot,signedAgent,staticResource,ja3Hash,ja4, а такжеdetectionIds. См. Переменные Bot Management для дополнительных сведений.
- Задается только при использовании Cloudflare Bot Management. Объект со следующими свойствами:
-
clientAcceptEncodingstring | null- Если Cloudflare заменяет значение
Accept-Encodingзаголовок, исходное значение сохраняется вclientAcceptEncodingсвойство, например"gzip, deflate, br".
- Если Cloudflare заменяет значение
-
clientQuicRttnumber | undefined- Сглаженное время приёма-передачи (RTT) между Cloudflare и клиентом для соединений QUIC, в миллисекундах. Присутствует только если клиент подключился по QUIC (HTTP/3). Например,
42.
- Сглаженное время приёма-передачи (RTT) между Cloudflare и клиентом для соединений QUIC, в миллисекундах. Присутствует только если клиент подключился по QUIC (HTTP/3). Например,
-
clientTcpRttnumber | undefined- Сглаженное время приёма-передачи (RTT) между клиентом и Cloudflare для соединений TCP, в миллисекундах. Присутствует только если клиент подключился по TCP (HTTP/1 и HTTP/2). Например,
22.
- Сглаженное время приёма-передачи (RTT) между клиентом и Cloudflare для соединений TCP, в миллисекундах. Присутствует только если клиент подключился по TCP (HTTP/1 и HTTP/2). Например,
-
coloстрока- Трёхбуквенный
IATA↗ код аэропорта дата-центра, обработавшего запрос, например,"DFW".
- Трёхбуквенный
-
countrystring | null- Страна входящего запроса. Двухбуквенный код страны в запросе. Это то же значение, что указано в
CF-IPCountryзаголовок, например"US".
- Страна входящего запроса. Двухбуквенный код страны в запросе. Это то же значение, что указано в
-
edgeL4Object | undefined- Статистика транспортного уровня (Layer 4) для соединения между клиентом и Cloudflare. Содержит следующее свойство:
deliveryRateчисло - Актуальная оценка скорости передачи данных для соединения, в байтах в секунду. Например,123456.
- Статистика транспортного уровня (Layer 4) для соединения между клиентом и Cloudflare. Содержит следующее свойство:
-
isEUCountrystring | null- Если страна входящего запроса входит в ЕС, это вернёт
"1". В противном случае это свойство либо отсутствует, либоfalse.
- Если страна входящего запроса входит в ЕС, это вернёт
-
httpProtocolстрока- Протокол HTTP, например,
"HTTP/2".
- Протокол HTTP, например,
-
hostMetadataObject | undefined- Заполняется только тогда, когда входящий запрос поступает из зоны с метаданными Custom Hostname. Подробнее о том, что можно добавить в качестве метаданные пользовательского хоста, и как это доступно в
hostMetadataполе.
- Заполняется только тогда, когда входящий запрос поступает из зоны с метаданными Custom Hostname. Подробнее о том, что можно добавить в качестве метаданные пользовательского хоста, и как это доступно в
-
requestPrioritystring | null- Информация о приоритизации, запрошенная браузером, в объекте запроса, например
"weight=192;exclusive=0;group=3;group-weight=127".
- Информация о приоритизации, запрошенная браузером, в объекте запроса, например
-
tlsCipherстрока- Шифр для соединения с Cloudflare, например
"AEAD-AES128-GCM-SHA256".
- Шифр для соединения с Cloudflare, например
-
tlsClientAuthObject | null- Различные сведения о клиентском сертификате (для mTLS-соединений). См. Переменные клиентского сертификата для дополнительных сведений.
-
tlsClientCiphersSha1строка- Хеш SHA-1 (в кодировке Base64) набора шифров (cipher suite), отправленного клиентом во время TLS handshake, в формате big-endian. Например,
"GXSPDLP4G3X+prK73a4wBuOaHRc=".
- Хеш SHA-1 (в кодировке Base64) набора шифров (cipher suite), отправленного клиентом во время TLS handshake, в формате big-endian. Например,
-
tlsClientExtensionsSha1строка- Хеш SHA-1 (в кодировке Base64) расширений TLS-клиента, отправленных во время handshake, в формате big-endian. Например,
"OWFiM2I5ZDc0YWI0YWYzZmFkMGU0ZjhlYjhiYmVkMjgxNTU5YTU2Mg==".
- Хеш SHA-1 (в кодировке Base64) расширений TLS-клиента, отправленных во время handshake, в формате big-endian. Например,
-
tlsClientExtensionsSha1Leстрока- Хеш SHA-1 (в кодировке Base64) расширений TLS-клиента, отправленных во время handshake, в формате little-endian. Например,
"7zIpdDU5pvFPPBI2/PCzqbaXnRA=".
- Хеш SHA-1 (в кодировке Base64) расширений TLS-клиента, отправленных во время handshake, в формате little-endian. Например,
-
tlsClientHelloLengthстрока- Длина сообщения client hello, отправленного в TLS-рукопожатие ↗. Например,
"508". А именно длину байтовой строки client hello.
- Длина сообщения client hello, отправленного в TLS-рукопожатие ↗. Например,
-
tlsClientRandomстрока- Значение 32-байтового случайного значения, предоставленного клиентом в TLS-рукопожатие ↗. См. RFC 8446 ↗ для дополнительных сведений.
-
tlsVersionстрока- Версия TLS-соединения с Cloudflare, например,
TLSv1.3.
- Версия TLS-соединения с Cloudflare, например,
-
citystring | null- Город, откуда поступил запрос, например,
"Austin".
- Город, откуда поступил запрос, например,
-
continentstring | null- Континент входящего запроса, например,
"NA".
- Континент входящего запроса, например,
-
latitudestring | null- Широта входящего запроса, например,
"30.27130".
- Широта входящего запроса, например,
-
longitudestring | null- Долгота места отправки входящего запроса, например
"-97.74260".
- Долгота места отправки входящего запроса, например
-
postalCodestring | null- Почтовый индекс входящего запроса, например,
"78701".
- Почтовый индекс входящего запроса, например,
-
metroCodestring | null- Код метро (DMA) входящего запроса, например,
"635".
- Код метро (DMA) входящего запроса, например,
-
regionstring | null- Если известно, ISO 3166-2 ↗ название региона первого уровня, связанного с IP адресом входящего запроса, например,
"Texas".
- Если известно, ISO 3166-2 ↗ название региона первого уровня, связанного с IP адресом входящего запроса, например,
-
regionCodestring | null- Если известно, ISO 3166-2 ↗ код региона первого уровня, связанного с IP адресом входящего запроса, например,
"TX".
- Если известно, ISO 3166-2 ↗ код региона первого уровня, связанного с IP адресом входящего запроса, например,
-
timezoneстрока- Часовой пояс входящего запроса, например,
"America/Chicago".
- Часовой пояс входящего запроса, например,
Методы
Методы экземпляра
Эти методы доступны только для экземпляра Request объект или через его прототип.
-
clone(): Request- Создает копию
Requestобъект.
- Создает копию
-
arrayBuffer(): Promise<ArrayBuffer>- Возвращает Promise, который разрешается с
ArrayBuffer↗ представление тела запроса.
- Возвращает Promise, который разрешается с
-
formData(): Promise<FormData>- Возвращает Promise, который разрешается с
FormData↗ представление тела запроса.
- Возвращает Promise, который разрешается с
-
json(): Promise<Object>- Возвращает Promise, который разрешается с представлением тела запроса в формате JSON.
-
text(): Promise<string>- Возвращает Promise, который разрешается со строковым (текстовым) представлением тела запроса.
Request контекст
Каждый раз, когда Worker вызывается входящим HTTP-запросом, fetch() обработчик вызывается для вашего Worker. Request контекст начинается, когда fetch() обработчик вызван, и асинхронные задачи (например, выполнение подзапроса с помощью fetch() API) можно запускать только внутри Request контекст:
export default {
async fetch(request, env, ctx) {
// Request context starts here
return new Response('Hello World!');
},
};При передаче promise в событие fetch .respondWith()
Если вы передаёте Promise с Response в событие fetch .respondWith() метод, контекст запроса остаётся активным на протяжении всех асинхронных задач, выполняемых до завершения promise ответа. Событие можно передать в асинхронный обработчик, например:
addEventListener("fetch", event => {
event.respondWith(eventHandler(event))
})
// No request context available here
async function eventHandler(event){
// Request context available here
return new Response("Hello, Workers!")
}Ошибки при попытке доступа к неактивному Request контекст
Любая попытка использовать API, такие как fetch() или получить доступ к Request контекст во время запуска скрипта вызовет исключение:
const promise = fetch("https://example.com/") // Error
async function eventHandler(event){..}Этот фрагмент кода выбросит исключение при запуске скрипта, и "fetch" слушатель события никогда не будет зарегистрирован.
Задайте Content-Length заголовок
Content-Length заголовок автоматически устанавливается средой выполнения на основе источника данных для Request равно этому значению. Любое значение, вручную заданное пользовательским кодом в Headers будет проигнорирован. Чтобы иметь Content-Length заголовка с указанным конкретным значением body из Request должен быть либо FixedLengthStream или значение фиксированной длины, как и строка, или TypedArray.
A FixedLengthStream представляет собой идентичность TransformStream который позволяет записать в него только фиксированное количество байтов.
const { writable, readable } = new FixedLengthStream(11);
const enc = new TextEncoder();
const writer = writable.getWriter();
writer.write(enc.encode("hello world"));
writer.end();
const req = new Request('https://example.org', { method: 'POST', body: readable });Использование любого другого типа ReadableStream в качестве тела запроса приведёт к использованию Chunked-Encoding.
Различия
Реализация Workers для Request интерфейс включает несколько расширений веб-стандарта Request API. Эти отличия сделаны намеренно и обеспечивают дополнительные функции, специфичные для среды выполнения Workers.
cf свойство
Workers добавляет cf свойство в Request объект, который содержит специфичные для Cloudflare метаданные о входящем запросе. Это свойство не входит в веб стандарт и доступно только в среде выполнения Workers. См. IncomingRequestCfProperties для получения подробностей.
headers свойство
headers свойство возвращает специфичный для Workers Headers объект, который включает дополнительные методы, такие как getAll() для Set-Cookie заголовки. См. Документация Headers подробнее о том, как Workers Headers реализация отличается от веб-стандарта.
Неизменяемость
Входящий Request объекты, передаваемые в fetch() обработчик неизменяемы. Чтобы изменить свойства входящего запроса, необходимо создать новый Request объект.
Дополнительные материалы
- Примеры: изменение свойства запроса
- Примеры: доступ к
cfобъект - Справка:
Response - Напишите код своего Worker на синтаксис ES modules для оптимальной работы.