フェッチ
Fetch API ↗は、ワーカー内でHTTPリクエストを介してリソースを非同期に取得するためのインターフェースを提供します。
export default { async scheduled(event, env, ctx) { return await fetch("https://example.com", { headers: { "X-Source": "Cloudflare-Workers", }, }); },};addEventListener('fetch', event => { // NOTE: まだ非同期スコープにいないため、ここでfetchを使用できません event.respondWith(eventHandler(event));});
async function eventHandler(event) { // `event.respondWith()`が受け取ったPromiseが解決されるのを待つため、ここでfetchをawaitできます const resp = await fetch(event.request); return resp;}-
fetch(resource, options optional): Promise<Response>- FetchはResponseへのPromiseを返します。
-
resource↗ リクエスト | 文字列 | URL -
optionsオプション- リクエストの内容と動作を定義するオブジェクト。
fetch() APIを使用してサブリクエストを行う際、サーバーが対応している場合に、サーバーが応答する圧縮形式を指定するためにAccept-Encoding ↗ヘッダーを含めることができます。
ワーカーはgzipおよびbrotli圧縮アルゴリズムの両方をサポートしています。通常、ワーカーランタイムの本番環境ではAccept-EncodingやContent-Encodingヘッダーを指定する必要はありません。オリジンから取得する際にbrotliまたはgzip圧縮が自動的に要求され、クライアントにデータを返す際に応答に適用されます。これは、クライアントとオリジンサーバーの機能に依存します。
オリジンからbrotliを要求するには、ワーカーでbrotli_content_encoding互換フラグを有効にする必要があります。まもなく、この互換フラグはすべてのワーカーに対してデフォルトで有効になります。
Accept-Encodingヘッダーが役立つシナリオの1つは、サーバーからクライアントへの圧縮データを通過させる場合です。Accept-Encodingにより、ワーカーは事前に解凍されることなく、サーバーから圧縮データストリームを直接受け取ることができます。圧縮応答のボディをクライアントに返す前に読み取らず、Content-Encodingヘッダーをそのまま保持しておけば、解凍されずに「パススルー」されます。これは、オリジンサーバーの前にワーカーを使用する場合や、圧縮されたメディアアセットを取得する場合に役立ちます。オリジンサーバーで使用されるのと同じ圧縮が、ワーカーが返す応答に使用されることを保証します。
コンテンツエンコーディングの変更に加えて、クライアントがサポートしていないエンコーディングを使用する応答の場合、再圧縮も必要です。たとえば、ワーカーがbrotliまたはgzipをエンコーディングとして要求し、クライアントがgzipのみをサポートしている場合、サーバーがbrotliエンコードされたデータを返すと、再圧縮が必要になります(自動的に適用されます)。この動作は、圧縮ルールに基づいて異なる場合があります。これにより、サーバー側で異なる種類のデータに対してどの圧縮を適用するかを構成できます。
export default { async fetch(request) { // brotliまたはgzip圧縮を受け入れる const headers = new Headers({ 'Accept-Encoding': "br, gzip" }); let response = await fetch("https://developers.cloudflare.com", {method: "GET", headers});
// 元の応答ボディが返され、Content-Encodingヘッダーが保持されていれば、 // 同じエンコードされたデータが再圧縮されることなく返されます。 return new Response(response.body, { status: response.status, statusText: response.statusText, headers: response.headers, }); }}- 例:
fetchを使用して別のサイトに応答する - 例: HTMLをフェッチする
- 例: JSONをフェッチする
- 例: Fetchを使用してキャッシュする
- 最適化された体験のために、ESモジュール構文でワーカーコードを書く。