Fetch API 操作を呼び出して、HTTP または HTTPS 経由で配信拠点(POP)からデータを取得し、ユーザーにデータを返すことができます。 ブラウザ環境の Fetch API と同様に機能し、コンテンツの動的ロード、バックエンド サービスとの対話、A/B テストなどのシナリオに使用できます。
Fetch API メソッド
Fetch は非同期呼び出しをサポートしています。 await
キーワードを使用しない限り、Fetch はスクリプトの実行をブロックしません。 Fetch では、一度に最大 4 つのサブリクエストを送信できます。 基礎となるレイヤーは持続的接続を使用しているため、接続プールを管理しなくても安定したパフォーマンスが保証されます。
Fetch API を呼び出して、HTTP または HTTPS リクエストを送信できます。 各 redirect
は 1 つのリクエストと見なされます。 各 Fetch API リクエストは、最大 12 の redirect
操作をサポートしています。
メソッド定義
fetch(arg, init)
は、Fetch メソッドとして使用されます。 詳細については、「WorkerOrGlobalScope.fetch()」をご参照ください。メソッドの制限
Fetch API はドメイン名をサポートしていますが、IP アドレスはサポートしていません。 HTTP リクエストはポート 80 を使用し、HTTPS リクエストはポート 443 を使用します。
init
パラメーターの内部credentials
、referrer
、referrerPolicy
、cache
、およびintegrity
パラメーターは使用されていません。デフォルトでは、
redirect
パラメーターはfollow
に設定されています。これは、fetch リクエストが 3xx リダイレクトに従うことを指定します。 fetch リクエストが 3xx リダイレクトに従わないようにするには、redirect
パラメーターをmanual
に設定します。
説明ブラウザは、さまざまなモードで fetch リクエストを同じ方法で処理します。 たとえば、
CROS fetch
を使用して、Alibaba Cloud CDN、DCDN、または ESA を使用して、任意のオリジン サーバーからリソースを取得できます。一度に 4 つを超えるサブリクエストを送信するには、チケットを送信して、クォータの増加をリクエストしてください。
リクエスト URL の全長は 4 KB を超えることはできません。
Fetch を使用して Gzip で圧縮されたリソースを取得する場合、これらのリソースは返される前に自動的に解凍されます。 リソースがデフォルトで解凍されないようにするには、「解凍」セクションの説明に従って、decompress パラメーターを
manual
に設定します。
タイムアウト期間の構成
Timeout
/** * リクエストのタイムアウトをデプロイ * * @param {Number} timeout. タイムアウト期間。単位:ミリ秒。 * @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)`, // kv リクエストのタイムアウト } }); let resp = await Promise.race([ kvRequest, timeoutPromise, ]); if (resp === undefined) { return "kv not found, key = " + key; // kv が見つかりません } else { return resp; }
リダイレクト
Fetch API は 3xx リダイレクトをサポートしています。 HTTP 3xx ステータスコードには、301、302、303、307、308 が含まれます。 redirect パラメーターを次のいずれかの値に設定できます。
{redirect: "manual"}
: 3xx リダイレクトに従いません。リダイレクトは自分で処理する必要があります。{redirect: "error"}
: 3xx ステータスコードが返されるとエラーをスローします。{redirect: "follow"}
: (デフォルト) 3xx リダイレクトに従います。最大 20 のリダイレクトがサポートされています。
次の表に、3xx リダイレクトについて説明します。
ステータスコード | 説明 |
301、302、303、308 | リクエストメソッドが GET に変更され、本文は無視されます。 |
307 | リクエストメソッドが GET の場合にのみ、Fetch リクエストはリダイレクトに従います。リクエストメソッドが GET でない場合は、例外がスローされます。 |
リクエストがリダイレクトされる URL は、Location ヘッダーに含まれています。 Location ヘッダーがない場合は、例外がスローされます。
Location ヘッダーには、コンマ (,) で区切られた URL のリストを含めることができます。 リクエストは、リストの最初の 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
ヘッダーを構成すると、データは Content-Length
ヘッダーで指定された形式でエンコードされ、Fetch API がデータを送信するために使用するメソッドが変更されます。 Content-Length
ヘッダーを構成しない場合、Fetch API は本文ストリーム内のすべてのデータを自動的にフェッチして送信します。 送信されるデータは、チャンク転送エンコーディングスキームを使用してエンコードされます。
Content-Length
設定Content-Length
ヘッダーが負でない値に設定されている場合、Fetch API はContent-Length
ヘッダーに基づいて本文ストリームからデータをフェッチして送信します。Content-Length
が 0 に設定されている場合、データは送信されません。Content-Length
ヘッダーが無効な値に設定されている場合、Fetch API は本文内のすべての値を送信します。 送信されるデータは、チャンク転送エンコーディングスキームを使用してエンコードされます。
例
Fetch API はデータを自動的に解凍します。 データが解凍された後、
Content-Length
ヘッダーはレスポンスに保持されます。Content-Length
ヘッダーは、データが解凍される前のデータサイズを示します。 本文を変更した後に Fetch API を呼び出す場合は、Content-Length
ヘッダーを変更する必要があるかどうかを確認してください。次の例では、
Content-Length
ヘッダーを含む POST リクエストがクライアントから送信されます。 Fetch API を呼び出してデータを取得する場合、リクエスト本文はクライアントリクエストからの Headers オブジェクトを使用します。Content-Length
ヘッダーの値は、本文の実際のサイズとは異なる場合があります。 Headers オブジェクトが送信される場合は、本文のサイズが変更されているかどうかを確認してください。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 オブジェクトの最大サイズは 8 KB です。 Headers オブジェクトのサイズがこの制限を超えると、JavaScript 例外がスローされます。
ブラックリスト
Fetch API はヘッダーブラックリストを使用します。 ブラックリストに含まれるヘッダーの読み取りまたは書き込みを試みると、例外がスローされます。 次の表に、ブラックリストに含まれるヘッダーについて説明します。
expect
te
trailer
upgrade
proxy-connection
connection
keep-alive
dnt
host
予約済みヘッダー
リクエスト
説明
Request 操作の詳細については、「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 操作は標準 API 操作です。 Request 操作は、ER のメモリリソースを消費する必要なく本文のすべての値をフェッチするときに、本文を無視します。 これにより、ガベージコレクション (GC) の一時停止時間が最小限に抑えられ、リクエスト本文のすべての値が基礎となるソケットからフェッチされることが保証されます。
await request.ignore()
の場合、フェッチされた本文を読み取る必要がないか、興味がない場合は、パフォーマンスを向上させるためにすべての fetch リクエストに対してrequest.ignore
を呼び出すことをお勧めします。 これは、ランタイムが完全に読み取られた本文を含むリクエストを将来使用するために接続プールに自動的に送信するためです。
レスポンス
説明
Response 操作の詳細については、「Response」をご参照ください。
制限
Response オブジェクトの useFinalURLS プロパティと error プロパティは実装されておらず、CDN/DCDN/ESA コンテキストでは意味がありません。
ユースケース
レスポンスコードをフェッチします:
response.status
。レスポンスの理由句をフェッチします:
response.statusText
。レスポンスヘッダーをフェッチします:
response.headers
。レスポンス URL をフェッチします:
response.url
。これは、レスポンスが送信された URL を示します。すべてのリダイレクト URL のリストをフェッチします (非標準):
response.urlList
。 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 バイトを超えることはできません。