INTEGRITY Документация

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"})

Параметры


Как 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,
		});
	},
};