← 用語集一覧へ戻る

fetch

Fetch API
development network beginner
JavaScriptでHTTPリクエストを送りサーバーやAPIからデータを取得するための組み込み関数のこと。ブラウザ標準で使え、Promise(非同期処理)ベースで動作する。
fetch (Fetch API)

概要(サマリー)

fetch とは、JavaScriptHTTPリクエストを送り、サーバーAPIからデータを取得するための組み込み関数のことである。ブラウザに標準搭載されており、外部ライブラリなしで使える。「フェッチ(fetch)」は英語で「取ってくる」という意味で、まさにサーバーからデータを取ってくる役割を担う。Promise(非同期処理)ベースで動作するため、データが届くまで処理を止めずに待機できる。

詳細解説

基本的な使い方(GETリクエスト)

fetch の最もシンプルな使い方は以下のとおりだ。

fetch('https://api.example.com/users')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error(error));

このコードは「指定したURLにGETリクエストを送り、返ってきたJSONデータを取得して表示する」という処理を行っている。.catch でエラーに対処する。

async/await を使うと、より読みやすく書ける。

async function getUsers() {
  try {
    const response = await fetch('https://api.example.com/users');
    const data = await response.json();
    console.log(data);
  } catch (error) {
    console.error(error);
  }
}

POSTリクエストの送り方

データをサーバーに送信する(作成・更新など)場合は、オプションでメソッドとボディを指定する。

fetch('https://api.example.com/users', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ name: '田中', email: 'tanaka@example.com' })
});

ヘッダーの設定(認証など)

多くのAPIは、アクセス時に認証情報をヘッダーに付与することを求める。最も一般的な方式が「Bearerトークン」を使った認証だ。

const token = 'your-api-token-here';

const response = await fetch('https://api.example.com/profile', {
  headers: {
    'Authorization': 'Bearer ' + token,
    'Content-Type': 'application/json'
  }
});
const data = await response.json();

Authorization ヘッダーにトークンを付与することで、「このリクエストを送ってよい権限を持つユーザーである」とサーバーに伝える。APIキーを使う場合も同様に、ヘッダーで渡すことが多い。

レスポンスのステータス確認

fetch はHTTPエラー(404や500など)でも .catch に入らない点に注意が必要だ。response.ok プロパティでステータスを確認する書き方が推奨される。

async function fetchData(url) {
  const response = await fetch(url);

  if (!response.ok) {
    throw new Error('リクエストが失敗しました: ' + response.status);
  }

  return response.json();
}

try {
  const data = await fetchData('https://api.example.com/data');
  console.log(data);
} catch (error) {
  console.error(error.message);
}

response.ok は、ステータスコードが200〜299のときに true になる。この書き方をパターンとして覚えておくと、どんなAPIを呼び出すときにも応用できる。

CORSとの関係

fetch で別オリジンのAPIを呼び出すと、CORSエラーが発生することがある。これはfetch自体の問題ではなく、ブラウザのセキュリティ制限とサーバー側のCORS設定の問題だ。AIコーディングでよく遭遇するパターンなので、CORSについても合わせて理解しておくとよい。

AIコーディングとfetchの関係

AIはfetchを使ったAPIとの通信コードを生成するのが得意だ。「このエンドポイントにPOSTリクエストを送り、レスポンスを表示して」といった指示で、適切なコードを生成してもらえる。

指示に「エラーハンドリングも含めて」「response.ok で成否を確認して」と明示すると、より実用的なコードが生成される。生成されたコードのURLやトークンは必ず実際の値に書き換えて使うこと。

よくある勘違い

fetchはエラーが出たら自動で.catchに入る?

そうではない。fetchはネットワーク障害など通信自体が失敗した場合のみ .catch に入る。サーバーが404や500を返した場合は「通信は成功している」とみなされるため、.catch には入らない。response.okresponse.status を使って明示的に確認する必要がある。

fetchはNode.jsでも使える?

Node.js 18以降ではグローバルにfetchが使えるが、それ以前のバージョンでは標準では使えなかった。Node.js環境では axiosnode-fetch といったライブラリが広く使われてきた経緯がある。axios はエラーハンドリングがシンプルで(4xxや5xxで自動的に例外をスロー)、設定の再利用もしやすいため、Node.jsや大規模プロジェクトでは今でも選ばれることが多い。

データを受け取ったらすぐ使える?

受け取ったレスポンスはそのままでは使えない。response.json()response.text() などのメソッドを呼び出してデータを変換する必要がある。これらも非同期処理(Promise)なので await が必要だ。

より詳しくAIに聞いてみよう

  • fetch APIとは何か、初心者でもわかるように説明してください。
  • fetchのPromiseとasync/awaitの書き方の違いを整理してください。
  • fetchで404エラーや500エラーを正しくハンドリングする方法を教えてください。
  • fetchでBearer認証を使ったAPIリクエストを送る方法を教えてください。
  • fetchとaxiosの違いと、どちらを選ぶべき場面を教えてください。