Fetch API

HTTP リクエストを送信するためのモダンな Web API で、XMLHttpRequest の後継

APIHTTP

Fetch API とは

Fetch API は、ブラウザと Node.js (v18 以降) で HTTP リクエストを送信するためのモダンな API である。Promise ベースで、XMLHttpRequest と比較してシンプルな記法で非同期通信を行える。

基本的な使い方

// GET リクエスト
const response = await fetch('https://api.example.com/users');
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const users: User[] = await response.json();

// POST リクエスト
const response = await fetch('https://api.example.com/orders', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ userId: '123', items: [{ productId: 'abc', qty: 1 }] }),
});

fetch の注意点

HTTP エラーで reject しない

// ❌ fetch は 404 や 500 でも reject しない
const response = await fetch('/api/users/999');
// response.ok === false, response.status === 404 だが、例外は投げない

// ✅ response.ok をチェック
if (!response.ok) {
  throw new Error(`API error: ${response.status} ${response.statusText}`);
}

タイムアウト

fetch にはデフォルトのタイムアウトがない。AbortController で設定する。

const controller = new AbortController();
setTimeout(() => controller.abort(), 5000);
const response = await fetch(url, { signal: controller.signal });

XMLHttpRequest との比較

観点 Fetch API XMLHttpRequest
構文 Promise ベース コールバックベース
ストリーミング ReadableStream 対応 非対応
リクエストキャンセル AbortController abort()
Cookie デフォルトで same-origin のみ デフォルトで送信
プログレス ReadableStream で実装 onprogress イベント

fetch はブラウザだけでなく Node.js 18 以降でもグローバルに利用可能で、Lambda などサーバーサイドでも使える。

Fetch API の理解を深めるには関連書籍が参考になる。

関連用語