Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

Fetch

最終更新 Markdown で表示Agent セットアップ

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

  • options options

    • cache undefined | 'no-store' | 'no-cache' 省略可
      • 標準の HTTP cache ヘッダーです。cache: 'no-store'cache: 'no-cache' だけをサポートします。 それ以外の cache ヘッダーを指定すると、メッセージ Unsupported cache mode: <attempted-cache-mode>TypeError になります。
        • すべてのリクエストで、Pragma: no-cacheCache-Control: no-cache ヘッダーをオリジンへ転送します。
        • no-store の場合、Cloudflare がホストしていないオリジンへのリクエストは、Cloudflare のキャッシュを使いません。
        • no-cache の場合、Cloudflare がホストしていないオリジンへのリクエストは、応答する前にオリジンへ再検証します。
    • リクエストの内容と動作を定義するオブジェクトです。

Accept-Encoding ヘッダーの扱い

fetch() API でサブリクエストを送るとき、サーバーが対応していればどの圧縮形式で応答してほしいかを、Accept-Encoding ヘッダーで指定できます。

Workers は gzip と brotli の両方の圧縮アルゴリズムをサポートします。Workers Runtime の本番環境では、通常 Accept-EncodingContent-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,
		});
	},
};

関連リソース

役に立ちましたか?