すべてのプロダクト
Search
ドキュメントセンター

Edge Security Acceleration:Fetch API

最終更新日:Dec 26, 2025

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 パラメーターの credentialsreferrerreferrerPolicycache、および integrity プロパティは効果がありません。

    • redirect のデフォルト値は follow です。これは、fetch がオリジンサーバーからの 3xx 応答をフォローすることを意味します。fetch が 3xx 応答をフォローしないようにするには、redirectmanual に設定します。

    説明
    • ブラウザで利用可能なさまざまな 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 バイトを超えることはできません。

Blob と File

  • 定義

    • Blob 操作の詳細については、Blob をご参照ください。

    • File 操作の詳細については、File をご参照ください。

  • 制限

    ER は、Blob および File 操作の標準に準拠した Blob および File クラスをサポートしています。ER はファイルの読み書きができません。ER がサポートする Blob および File クラスをレスポンス本文に渡すことができます。content-type ヘッダーの値は、Blob または File 操作の MIME タイプと同じです。