Fetch API ↗ は、Worker 内から HTTP リクエストでリソースを非同期に取得するためのインターフェイスです。
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は Response の Promise を返します。
-
resource↗ Request | string | URL -
optionsoptionscacheundefined | 'no-store' | 'no-cache'省略可- 標準の HTTP
cacheヘッダーです。cache: 'no-store'とcache: 'no-cache'だけをサポートします。 それ以外のcacheヘッダーを指定すると、メッセージUnsupported cache mode: <attempted-cache-mode>のTypeErrorになります。- すべてのリクエストで、
Pragma: no-cacheとCache-Control: no-cacheヘッダーをオリジンへ転送します。 no-storeの場合、Cloudflare がホストしていないオリジンへのリクエストは、Cloudflare のキャッシュを使いません。no-cacheの場合、Cloudflare がホストしていないオリジンへのリクエストは、応答する前にオリジンへ再検証します。
- すべてのリクエストで、
- 標準の HTTP
- リクエストの内容と動作を定義するオブジェクトです。
fetch() API でサブリクエストを送るとき、サーバーが対応していればどの圧縮形式で応答してほしいかを、Accept-Encoding ↗ ヘッダーで指定できます。
Workers は gzip と brotli の両方の圧縮アルゴリズムをサポートします。Workers Runtime の本番環境では、通常 Accept-Encoding や Content-Encoding ヘッダーを指定する必要はありません。オリジンからの取得時に brotli または gzip 圧縮が自動で要求され、クライアントとオリジンサーバーの対応状況に応じて、クライアントへ返すレスポンスにも適用されます。
オリジンへ brotli を要求するには、Worker で brotli_content_encoding 互換性フラグを有効にする必要があります。まもなく、この互換性フラグは、今後の互換性日付以降のすべての 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 を取得する
- 例: JSON を取得する
- 例: Fetch でキャッシュする
- Worker のコードは ES modules 構文 で書くと、より効率的です。
- Error 526
- 部分セットアップでの Fetch API