Fetch API は、POP (Points of Presence) からデータを取得するためのメソッドです。Fetch API を使用すると、HTTP または HTTPS 経由で POP にデータをリクエストし、そのデータをユーザーに返すことができます。これは、ブラウザ環境の Fetch API と同様であり、動的コンテンツの読み込み、バックエンドサービスとの連携、A/B テストの実装などのシナリオに適しています。
Fetch API メソッドの定義
Fetch は完全に非同期です。await を使用しない限り、スクリプトの実行をブロックしません。一度に最大 4 つのサブリクエストを送信できます。基盤となるレイヤーでは持続的接続が使用されるため、接続プールを管理する必要はありません。
Fetch は HTTP または HTTPS リクエストを行うことができます。各 redirect は 1 つのリクエストとしてカウントされます。各 fetch リクエストは、最大 12 回の redirect 操作をサポートします。
メソッドの定義
fetch(arg, init)。詳細については、MDN ドキュメントの WorkerOrGlobalScope.fetch() をご参照ください。メソッドの制限
Fetch API はドメイン名のみをサポートし、IP アドレスはサポートしません。HTTP リクエストのデフォルトポートは 80、HTTPS リクエストのデフォルトポートは 443 です。
initパラメーターのcredentials、referrer、referrerPolicy、cache、およびintegrityプロパティは効果がありません。redirectのデフォルト値はfollowです。これは、fetch がオリジンサーバーからの 3xx 応答をフォローすることを意味します。fetch が 3xx 応答をフォローしないようにするには、redirectをmanualに設定します。
説明ブラウザで利用可能なさまざまな Fetch モードは適用されません。例えば、CDN、DCDN、または ESA では、
CORS フェッチを使用して任意のオリジンサーバーからデータを取得できます。4 つ以上のサブリクエストを送信するには、かチケットを送信してクォータの引き上げをリクエストしてください。
リクエスト URL の全長は 4 KB を超えることはできません。
関数が Fetch を使用して取得する Gzip 圧縮されたリソースは、デフォルトで解凍されます。デフォルトの解凍を防ぐには、
manualパラメーターを追加します。詳細については、「解凍」セクションをご参照ください。
タイムアウト期間の設定
タイムアウト関数
/** * リクエストタイムアウト制御の実装 * * @param {Number} timeout タイムアウト期間 (ms) * @param {Object} config タイムアウト設定 * - @param {Object|Funtion} handler タイムアウト時に返す値 * @returns */ const RequestTimeout = (timeout, config) => { return new Promise((resolve) => { const { handler = null } = config; let timer = setTimeout(() => { clearTimeout(timer); timer = null; const defaultRes = (typeof handler === 'function' ? handler() : handler) || {}; resolve(defaultRes); }, timeout); }); };呼び出し例
const KV_TIMEOUT = 1000; let edgekv = new EdgeKV({ namespace: KV_NS, }); let kvRequest = edgekv.get(key, getType); let timeoutPromise = RequestTimeout(KV_TIMEOUT, { handler: { res: {}, errorMessage: `kv request timeout (${KV_TIMEOUT}ms)`, } }); let resp = await Promise.race([ kvRequest, timeoutPromise, ]); if (resp === undefined) { return "kv not found, key = " + key; } else { return resp; }
リダイレクト
Fetch は 3xx リダイレクトをフォローできます。これらのステータスコードには、301、302、303、307、308 が含まれます。次の 3 つの動作のいずれかを指定できます。
{redirect: "manual"}:3xx リダイレクトをフォローしません。リダイレクトは手動で処理する必要があります。{redirect: "error"}:3xx 応答に対してエラーがスローされます。{redirect: "follow"}:(デフォルト) 3xx リダイレクトをフォローします。最大 20 回のリダイレクトをフォローできます。
リダイレクトメソッドについては、次の表で説明します。
ステータスコード | リダイレクトの詳細 |
301、302、303、308 | リクエストメソッドは GET に変更され、本文は無視されます。 |
307 | GET メソッドのみがフォローされます。他のメソッドではエラーが報告されます。 |
リダイレクトアドレスは Location ヘッダーから取得されます。Location ヘッダーは必須です。このヘッダーがない場合、エラーが報告されます。
Locationヘッダーには、カンマ (,) で区切られた URL のリストを含めることができます。最初の URL のみが使用され、その他は無視されます。Locationヘッダーには、絶対 URL または相対 URL を含めることができます。
解凍
Fetch API では、fetch("https://www.example.com",{decompress: "manual"}) のように解凍モードを設定できます。decompress パラメーターは次の値をサポートします:
manual:データを解凍しません。サーバーが fetch リクエストに対して圧縮データを返した場合、EdgeRoutine (ER) が受信するデータも圧縮されています。
decompress:データを自動的に解凍します。これはデフォルト値です。Fetch API は Gzip 圧縮をサポートしています。ER は `Content-Encoding` ヘッダーに基づいてデータを自動的に検出または解凍します。ER がデータを解凍した後、ER は `Content-Encoding` の値を変更します。Gzip パラメーターが削除された場合、データ転送中の例外を防ぐために次の設定を行うことができます:
content-encoding: gzip:ER は `Content-Encoding` の値を認識し、データを解凍します。content-encoding: gzip, identity:ER は `Content-Encoding` の値を認識し、データを解凍します。
説明Gzip 以外のアルゴリズムは例外を引き起こします。
fallbackIdentity:この値の効果は decompress の値の効果と似ています。ER がこの値を認識できない場合、ER はデータを解凍しません。
Fetch API がデータを自動的に解凍した後、応答に `Content-Length` ヘッダーが含まれている場合、必要に応じて `Content-Length` ヘッダーを渡すことはできません。これは、`Content-Length` ヘッダーが解凍前のデータサイズを示すためです。
content-length
fetch リクエストで content-length を設定すると、Fetch は content-length エンコーディングを使用し、本文を送信する際のデフォルトの動作をオーバーライドします。content-length を設定しない場合、Fetch は本文ストリームからすべてのデータを読み取り、チャンクエンコーディングを使用して送信します。
content-lengthの設定content-lengthが非負の数値の場合:Fetch は本文ストリームから指定されたバイト数のデータを読み取って送信します。データはcontent-lengthエンコーディングを使用して送信されます。content-lengthが 0 の場合、データは送信されません。content-lengthが無効な値の場合:Fetch は本文のすべてのデータをチャンクエンコーディングを使用して送信します。
例
Fetch はコンテンツを自動的に解凍します。解凍後も、応答の
content-lengthヘッダーは存在します。このcontent-lengthは解凍前のデータサイズを示します。Fetch を使用する前に本文を変更する場合は、content-lengthに注意してください。そうしないと、送信されるコンテンツが正しくない可能性があります。次の例では、クライアントが
content-lengthヘッダーを含む POST リクエストを送信すると仮定します。Fetch を使用して新しいリクエストを作成し、クライアントリクエストのヘッダーオブジェクトを再利用する場合、content-lengthの値が実際に送信される本文のサイズと一致しない可能性があります。ヘッダーを渡すときは、常に実際の本文サイズが変更されていないかを確認してください。export default { fetch(request) { return handleRequest(request) } } async function handleRequest(request) { return fetch("http://www.example.com", { headers: request.headers, method: request.method, body: "SomeData" }); }
Headers
定義
Headers オブジェクトの詳細については、Headers をご参照ください。
制限
ヘッダーは消費されるメモリリソースの量を記録します。Headers オブジェクトの最大サイズは 8 KB です。Headers オブジェクトのサイズがこの制限を超えると、JavaScript 例外がスローされます。
ブラックリスト
Fetch API はヘッダーのブラックリストを使用します。ブラックリストにあるヘッダーを読み書きしようとすると、例外がスローされます。次のリストは、ブラックリストに含まれるヘッダーです。
expect
te
trailer
upgrade
proxy-connection
connection
keep-alive
dnt
host
予約済みヘッダー
Request
定義
詳細については、MDN ドキュメントの Request をご参照ください。
制限
Request オブジェクトの次のプロパティは実装されておらず、CDN、DCDN、または ESA のコンテキストでは適用されません。
context
credentials
destination
integrity
mode
referrer
referrerPolicy
cache
一般的な使用方法
リクエストメソッドの取得:
request.method。リクエスト URL の取得:
request.url。リクエストヘッダーの取得:
request.headers。リクエストペイロードの取得:
request.body。本文は ReadableStream オブジェクトです。JSON の取得:
await request.json()。フォームデータの取得:
await request.formData()。UTF-8 文字列の取得:
await request.text()。
Request インターフェイスは標準の拡張です。これにより、リクエスト本文を無視しながら、本文ストリームが基盤となるソケットから完全に読み取られることを保証できます。本文は JavaScript 仮想マシンのメモリに読み込まれないため、ガベージコレクション (GC) の遅延を回避できます。Fetch リクエストの本文を読み取る必要がない場合は、
request.ignoreを呼び出します。例:await request.ignore()。これにより、本文が完全に読み取られた後、ランタイムが自動的に接続を接続プールに戻して再利用するため、パフォーマンスが向上します。
Response
定義
詳細については、MDN ドキュメントの Response をご参照ください。
制限
Response オブジェクトの useFinalURLS および error プロパティは実装されておらず、CDN、DCDN、または ESA のコンテキストでは適用されません。
一般的な使用方法
レスポンスコードの取得:
response.status。レスポンスの理由フレーズの取得:
response.statusText。レスポンスヘッダーの取得:
response.headers。レスポンス URL の取得:
response.url。これは、すべてのリダイレクト後の最終的な URL です。すべてのリダイレクト URL のリストを取得 (非標準):
response.urlList。Response オブジェクトは、Request オブジェクトと同様に body mixin を実装しています。同様のメソッドを使用して body オブジェクトを取得できます。
FormData
定義
FormData 操作の詳細については、FormData をご参照ください。
制限
FormData 操作は Headers 操作に似ています。FormData はヘッダーのサイズを制限します。ヘッダーのサイズが上限を超えると、例外がスローされます。FormData を HTTP リクエスト本文として送信する場合、
content-typeはデフォルトでform-data/multipartに設定されます。
URLSearchParams
定義
URLSearchParams 操作の詳細については、URLSearchParams() をご参照ください。
制限
URLSearchParams を HTTP リクエスト本文として送信する場合、
content-typeはデフォルトでapplication/x-www-form-urlencodeに設定されます。データサイズは 1,000 バイトを超えることはできません。