← Cloudflare Workers / workers / runtime-apis
Fetch
Fetch API ↗ poskytuje rozhraní pro asynchronní načítání zdrojů prostřednictvím HTTP požadavků uvnitř Workeru.
Syntaxe
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 vrací promise s objektem Response.
Parametry
-
resource↗ Request | string | URL -
optionsmožnosticacheundefined | 'no-store' | 'no-cache'volitelné- Standardní HTTP
cachehlavička. Pouzecache: 'no-store'acache: 'no-cache'jsou podporovány. Jakýkoli jinýcachehlavička způsobíTypeErrorse zprávouUnsupported cache mode: <attempted-cache-mode>. _ U všech požadavků toto přeposíláPragma: no-cacheaCache-Control: no-cachehlavičky origin serveru. _ Prono-store, požadavky na originy, které nejsou hostované na Cloudflare, obcházejí použití cache Cloudflare. _ Prono-cache, požadavky na originy, které nejsou hostované na Cloudflare, jsou vynuceně revalidovány u origin serveru před odpovědí.
- Standardní HTTP
- Objekt, který definuje obsah a chování požadavku.
Jak Accept-Encoding hlavička je zpracována
Při vytváření podpožadavku pomocí fetch() API můžete určit, jaké formy komprese preferujete v odpovědi serveru (pokud je server podporuje), a to zahrnutím Accept-Encoding ↗ hlavička.
Workers podporují kompresní algoritmy gzip i brotli. Obvykle není nutné uvádět Accept-Encoding nebo Content-Encoding hlavičky v produkčním prostředí Workers Runtime: komprese brotli nebo gzip se automaticky vyžádá při načítání dat z origin serveru a použije se na odpověď při jejich vrácení klientovi, podle možností klienta a origin serveru.
Chcete-li podporovat vyžádání brotli z origin serveru, musíte povolit brotli_content_encoding příznak kompatibility ve Workeru. Tento příznak kompatibility bude brzy ve výchozím nastavení povolen pro všechny Workery od nadcházejícího data kompatibility.
Chování passthrough
Jeden scénář, ve kterém je hlavička Accept-Encoding užitečná, nastává při předávání komprimovaných dat ze serveru klientovi: Accept-Encoding umožňuje workeru přijmout komprimovaný datový proud přímo ze serveru, aniž by byl předtím dekomprimován. Pokud tělo komprimované odpovědi nepřečtete před jejím vrácením klientovi a zachováte Content-Encoding hlavičku nedotčenou, projde beze změny, aniž by se dekomprimovala a znovu komprimovala. To se hodí, když používáte Workers před origin servery nebo když načítáte komprimovaná mediální aktiva, protože zajistíte, aby se v odpovědi, kterou váš Worker vrátí, použila stejná komprese jako na origin serveru.
Kromě změny kódování obsahu je rekomprese potřeba i tehdy, když odpověď používá kódování, které klient nepodporuje. Pokud Worker jako kódování požaduje brotli nebo gzip, ale klient podporuje pouze gzip, rekomprese bude potřeba i v případě, že server vrátí data zakódovaná pomocí brotli (a bude provedena automaticky). Toto chování se může lišit také podle pravidla komprese, pomocí kterého lze nastavit, jaká komprese se má použít pro různé typy dat na straně serveru.
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,
});
},
};Související zdroje
- Příklad: použití
fetchpro odpověď jiným webem - Příklad: načtení HTML
- Příklad: načtení JSON
- Příklad: cachování pomocí Fetch
- Napište kód svého Workeru v syntaxe ES modulů pro optimalizovaný zážitek.
- Chyba 526
- Fetch API v částečném nastavení