APIとは — Webサービスをつなぐしくみ(REST・エンドポイント・認証)

API(Application Programming Interface)は、あるソフトウェアの機能を外部のプログラムから呼び出すための取り決めです。中でも HTTP でネットワーク越しに呼び出す Web API は、地図・決済・天気・生成AIなど、あらゆるサービス連携の土台になっています。本記事では、エンドポイントと HTTP メソッド、リクエスト/レスポンスの中身、REST の考え方、認証・認可、そして CORS やレート制限といった実際のつまずきまでを整理します。

結論を先に:Web API を理解するとは、「どの URL に」「どのメソッドで」「何を送り」「何が返るか」の 4 点を読めるようになることです。あとは認証(誰として呼ぶか)とエラー処理(失敗したらどうするか)を押さえれば、たいていの API ドキュメントは自力で読めます。

1. API とは — 「使い方の取り決め」

API は、機能を提供する側が「この形式で呼べば、この形式で返します」と約束した窓口の仕様です。レストランのメニューに例えられます。客(呼び出す側)は厨房の作り方を知らなくても、メニューに書かれた名前で注文すれば料理が出てきます。内部の実装を知らなくても使えるという点が API の本質です。

この「約束」を守ることが提供側の責任であり、だからこそ API にはバージョン/v1/ など)が付きます。約束を壊す変更(破壊的変更)をするときは、新しいバージョンとして分けるのが定石です。

2. エンドポイントと HTTP メソッド

Web API の呼び出し先 URL をエンドポイントと呼びます。エンドポイントは「どのリソース(対象)か」を表し、HTTP メソッドが「そのリソースに何をするか」を表します。

例:https://api.example.com/v1/users/42 は「ID が 42 のユーザー」というリソースを指します。

メソッド意味性質
GET取得する(GET /v1/users/42安全(サーバの状態を変えない)・べき等
POST新規作成する(POST /v1/usersべき等でない(2回送れば2件できうる)
PUT丸ごと置き換える(PUT /v1/users/42べき等(何回送っても結果は同じ)
PATCH一部だけ更新する実装によりべき等とは限らない
DELETE削除する(DELETE /v1/users/42べき等(すでに無ければ変化なし)

べき等(idempotent)とは「同じリクエストを何度送っても、結果の状態が変わらない」性質のことです。通信エラー時に安全に再送できるかを左右するため、実務では重要な区別になります。POST はべき等でないため、決済のような処理では冪等キー(Idempotency-Key ヘッダ等)を付けて二重実行を防ぐ設計がよく使われます。

取得条件はクエリ文字列で渡します。例:GET /v1/users?role=admin&limit=20。値に日本語や記号を含む場合はURLエンコードが必要です。

3. リクエストとレスポンスの中身

HTTP のやり取りは、ヘッダ(メタ情報)とボディ(データ本体)に分かれます。Web API ではボディに JSON を使うのが一般的です。

POST /v1/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer eyJhbGciOi...
Accept: application/json

{"name": "田中太郎", "role": "admin"}

これに対する応答は、ステータスコードとヘッダ、そして JSON のボディで返ります。

HTTP/1.1 201 Created
Content-Type: application/json

{"id": 42, "name": "田中太郎", "role": "admin"}

ステータスコードは「どうなったか」を 3 桁で表す、API 読解の要です。

コード意味典型的な場面
200 OK成功GET でデータが返った
201 Created作成成功POST でリソースを作った
204 No Content成功・本文なしDELETE が完了した
400 Bad Requestリクエストが不正必須項目が無い・JSON が壊れている
401 Unauthorized認証されていないトークンが無い・期限切れ
403 Forbidden権限が無い認証済みだが操作を許されていない
404 Not Found対象が無い存在しない ID を指定した
429 Too Many Requests呼びすぎレート制限に達した
500 Internal Server Errorサーバ側の障害API 提供側の不具合
4xx と 5xx の切り分けが第一歩。4xx はこちら(呼び出し側)の問題なので、送っている内容を直します。5xx は相手(サーバ側)の問題なので、こちらの入力を変えても直りません。時間を置いて再試行し、続くようなら提供元に問い合わせます。この切り分けを最初にするだけで、無駄なデバッグを大幅に減らせます。

4. REST の考え方 — リソース指向とステートレス

REST(Representational State Transfer)は、Roy Fielding が 2000 年の博士論文で示したアーキテクチャスタイルです。プロトコルでも規格でもなく「Web らしく作るための原則」であり、その原則に沿った API を RESTful な API と呼びます。

REST の利点は、HTTP の既存の仕組み(メソッド・ステータスコード・キャッシュ)をそのまま使えることです。学習コストが低く、ツールやプロキシ、CDN との相性も良いため、Web API の事実上の標準になっています。

5. 認証と認可 — APIキー・Bearerトークン・OAuth

公開データ以外の API では、「誰として呼んでいるか」を示す必要があります。認証(誰か)と認可(何をしてよいか)は別の概念です。

秘密キーをブラウザの JavaScript に書かない。フロントエンドのコードも通信も利用者から丸見えです。秘密の資格情報が必要な呼び出しは自社サーバ側で行い、ブラウザからは自社サーバの API を呼ぶ構成(BFF / プロキシ)にします。キーは環境変数などサーバ側に置き、リポジトリにコミットしないことも同じくらい重要です。

6. つまずきやすい点 — CORS・レート制限・エラー処理

API を実際に呼び始めると、ほぼ必ず出会う 3 つの壁があります。

CORS(クロスオリジン制約)

ブラウザは、あるサイトの JavaScript が別オリジン(ドメイン・スキーム・ポートの組)の API を無制限に読むことを既定で禁じています。許可するには、API 側Access-Control-Allow-Origin ヘッダを返す必要があります。ここで重要なのは、CORS はブラウザが課す制約であって、サーバ同士の通信や curl には関係しないという点です。「curl では動くのにブラウザだと失敗する」なら、まず CORS を疑います。

レート制限

多くの API は「1 分あたり N 回まで」といった上限を設け、超えると 429 Too Many Requests を返します。Retry-After ヘッダや残回数ヘッダが返ることが多いので、それに従って待ちます。再試行は指数バックオフ(1秒、2秒、4秒…と間隔を空ける)にし、闇雲な即時リトライは避けます。

エラー処理とタイムアウト

ネットワーク越しの呼び出しは失敗するのが普通です。ステータスコードを必ず確認し(fetch は 404 や 500 でも例外を投げません)、タイムアウトを設定し、再試行してよいのはべき等な操作だけ、と決めておきます。

const res = await fetch('https://api.example.com/v1/users/42', {
  headers: { 'Authorization': 'Bearer ' + token, 'Accept': 'application/json' }
});
if (!res.ok) throw new Error('API error: ' + res.status);
const user = await res.json();

7. REST 以外の選択肢 — GraphQL・gRPC・WebSocket

REST が万能というわけではありません。用途に応じて他の方式も使われます。

方式特徴向いている場面
RESTURL=リソース、HTTPメソッドで操作。JSON が主流汎用のWeb API。キャッシュを活かしたい
GraphQLクライアントが必要なフィールドを指定して取得画面ごとに必要データが大きく異なる場合
gRPCスキーマ定義から生成、バイナリで高速マイクロサービス間の内部通信
WebSocket接続を維持し双方向にやり取りチャット・通知など、サーバから押し出したい場合

迷ったら REST から始めるのが定石です。学習コストが低く、ツールが揃っており、必要になったときに他方式へ移行・併用できます。GraphQL は「1画面のために何度も API を呼ぶ(アンダーフェッチ)/使わないフィールドまで返る(オーバーフェッチ)」が痛みとして現れてから検討すれば十分です。

Free Tool JSON Formatter で API レスポンスを読む 1行にまとまった API のレスポンスを、ブラウザ内で整形して構造を確認できます。文法エラーの位置も分かります。

よくある質問(FAQ)

API と Web API の違いは何ですか?

API はソフトウェアの機能を外部から呼び出すための取り決め全般を指す言葉で、OS のシステムコールやライブラリの関数も API です。そのうち HTTP を使ってネットワーク越しに呼び出すものを特に Web API と呼びます。今日「API を叩く」と言うときは、多くの場合 JSON をやり取りする Web API を指しています。

REST と GraphQL はどちらを使うべきですか?

用途によります。リソースの取得・作成・更新・削除が中心で、HTTP のキャッシュやステータスコードをそのまま活かしたいなら REST が扱いやすい選択肢です。画面ごとに必要なフィールドが大きく異なり、複数リソースをまとめて取得したい(オーバーフェッチ・アンダーフェッチを避けたい)場合は GraphQL が向きます。まず REST で始め、必要が生じたときに検討するのが現実的です。

API キーをフロントエンドの JavaScript に書いても大丈夫ですか?

秘密の API キーをブラウザ側のコードに書いてはいけません。JavaScript のソースも通信内容も利用者から見えるため、キーはそのまま漏えいします。秘密キーが必要な呼び出しは自社のサーバ側で行い、ブラウザからは自社サーバの API を呼ぶ構成にします。どうしてもブラウザから直接呼ぶ場合は、公開前提の(権限を絞った)キーを使い、リファラ制限やドメイン制限、レート制限を併用します。

← 技術ブログ一覧へ戻る