1. ホーム
  2. JavaScript

【JavaScript】fetch()でAPIと通信する方法|async/awaitでデータを取得・送信する

Share

JavaScript でサーバーからデータを取得したり、フォームの内容を送信したりするときに使うのが fetch() です。外部の API からデータを読み込んで画面に表示する、といった処理の基本になります。この記事では、fetch() の基本的な使い方を、async / await やエラーハンドリング、POST 送信まで含めて解説します。

fetch() とは

fetch() は、指定した URL に HTTP リクエストを送り、その結果を受け取るための関数です。ブラウザに標準で備わっているため、ライブラリを読み込まずにそのまま使えます。

fetch()Promise(非同期処理の結果を表すオブジェクト)を返します。通信は時間がかかる処理なので、結果を「待ってから」次の処理に進む、という書き方をします。Promise や async / await の基礎については別記事も参考にしてください。

基本の使い方(データを取得する)

もっとも基本的な使い方は、URL を渡して結果を受け取る形です。fetch() が返す Promise を .then() でつなぎ、レスポンスを JSON に変換して使います。

script.js
fetch('https://api.example.com/users')
  .then((response) => response.json()) // レスポンスをJSONに変換
  .then((data) => {
    console.log(data); // 取得したデータ
  });

1つ目の .then() で受け取る response は「レスポンス本体」で、まだデータそのものではありません。response.json() を呼んで JSON に変換すると、2つ目の .then() で実際のデータ(data)を受け取れます。

async / await で書く

.then() をつなげる書き方は、処理が増えるとネストが深くなりがちです。async / await を使うと、上から下に読める自然なコードになります。

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

getUsers();

await は「この処理が終わるまで待つ」という意味です。await を使う関数には async を付ける必要があります。.then() 版と同じ動きですが、こちらのほうが読みやすいことが多いです。

エラーを正しく処理する

ここが fetch() でつまずきやすいポイントです。fetch()通信そのものに失敗したときだけエラー(reject)になり、404 や 500 などの HTTP エラーではエラーになりません。そのため、response.ok を自分でチェックする必要があります。

script.js
async function getUsers() {
  try {
    const response = await fetch('https://api.example.com/users');

    // 404や500などのHTTPエラーはここで自分で判定する
    if (!response.ok) {
      throw new Error(`HTTPエラー: ${response.status}`);
    }

    const data = await response.json();
    console.log(data);
  } catch (error) {
    // 通信エラーや上のthrowをまとめて受け取る
    console.error('取得に失敗しました:', error);
  }
}

response.ok はステータスコードが 200 番台のとき true になります。false のときは throw でエラーを投げ、catch でまとめて処理します。これで「サーバーは応答したがエラーだった」ケースも取りこぼしません。

POST でデータを送る

データを送信するときは、第2引数のオプションで methodheadersbody を指定します。JSON を送る場合は、Content-Type を指定し、bodyJSON.stringify() で文字列に変換します。

script.js
async function createUser() {
  const response = await fetch('https://api.example.com/users', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      name: '山田太郎',
      email: 'taro@example.com',
    }),
  });

  const data = await response.json();
  console.log(data);
}

送信するデータはオブジェクトのままでは送れないため、JSON.stringify() で文字列に変換するのを忘れないようにしましょう。

データが取れない・エラーになるときは

fetch() は手軽な反面、独特のクセでつまずきやすい関数です。思った通りに動かないときは、次のポイントを確認してみてください。

response.json() を呼んでいない

fetch() が返すのは「レスポンス本体」で、まだデータそのものではありません。response.json()(や response.text())を呼んで中身を取り出す必要があります。これを忘れると、データではなくレスポンスオブジェクトを扱おうとして、うまく中身を読めません。

HTTP エラーが検知できていない

これが一番のハマりどころです。fetch() は通信そのものに失敗したときだけエラーになり、404 や 500 などの HTTP エラーでは catch に入りません。つまり「サーバーは応答したがエラーだった」ケースは、自分で response.ok を確認しないと素通りしてしまいます。エラー時に throw して catch で処理する形にしておきましょう。

await を付け忘れている

await を付け忘れると、データではなく Promise(処理中の状態)がそのまま返ってきます。fetch()response.json() の両方に await を付けているか、そして await を使う関数に async が付いているかを確認してください。

送信する body を文字列にしていない

POST などでデータを送るとき、body にオブジェクトをそのまま渡しても正しく送れません。JSON.stringify() で文字列に変換し、あわせて Content-Type: application/json を指定しているか確認しましょう。

まとめ

fetch() は、ブラウザだけで HTTP 通信ができる便利な関数です。基本の流れを押さえておけば、API からのデータ取得もフォームの送信も同じパターンで書けます。

  • 取得は fetch(url)response.json() でデータを取り出す
  • async / await を使うと上から下に読めるコードになる
  • HTTP エラーは response.ok で自分で判定する
  • 送信は methodheadersbodyJSON.stringify())を指定する

まずは公開されている練習用の API を使って、データを取得して console.log() で表示するところから試してみると理解が早いです。

参考リンク