HTTPを実務で使ううえで、メソッドとステータスコードは最重要の基本要素です。どの操作をしたいのか、結果が成功か失敗かを正しく表現できるようになると、API設計と不具合調査の精度が上がります。
HTTPメソッドは「何をしたいか」を表し、ステータスコードは「どうなったか」を表します。この2つを分けて理解すると、通信の意味を短時間で読めるようになります。
HTTP通信では、クライアントはメソッドで操作の意図を示し、サーバーはステータスコードで処理結果を返します。
この対応が曖昧だと、API設計もデバッグもぶれやすくなります。
最初に押さえるべきHTTPメソッドは、GET、POST、PUT、PATCH、DELETEです。特にGETとPOSTだけで終わらず、更新系の違いも早めに整理すると実務で役立ちます。
| メソッド | 主な用途 | 典型例 |
|---|---|---|
GET | 取得 | 商品一覧を見る |
POST | 新規作成、処理実行 | 注文を作成する |
PUT | 全体更新 | ユーザー情報を丸ごと更新する |
PATCH | 部分更新 | ユーザー名だけ変更する |
DELETE | 削除 | 商品を削除する |
GETはリソースを取得するためのメソッドです。基本的には副作用を持たせず、同じ条件なら同じ結果を返すことが期待されます。
GETは最もよく使うメソッドです。Webページ表示、一覧取得、詳細取得などで使われます。
GET /products/1 HTTP/1.1
Host: api.example.com
Accept: application/json
よくある用途: 一覧取得、詳細取得、検索、ページネーション付き取得
注意点として、GETでデータ更新を行ったり、サーバー状態を変える操作を含めたりするのは避けましょう。またキャッシュ対象になりうることも意識が必要です。
POSTは新規作成や、単純な取得では表しにくい処理実行に使われます。入力データを本文で送ることが多いメソッドです。
POST /orders HTTP/1.1
Host: api.example.com
Content-Type: application/json
{
"product_id": 10,
"quantity": 2
}
よくある用途: 新規作成、フォーム送信、ログイン、複雑な検索条件の処理、バッチ実行
なお、何でもPOSTに寄せすぎるとAPIの意味が読みにくくなります。作成成功なら 201 Created を返す設計が自然です。
PUTは対象リソースを全体として置き換える更新に向くメソッドです。送った内容で丸ごと更新するという前提で設計されることが多いです。
PUT /users/1 HTTP/1.1
Host: api.example.com
Content-Type: application/json
{
"name": "Yamada",
"email": "yamada@example.com",
"role": "admin"
}
一部項目だけ送る設計にすると、PATCHとの違いが曖昧になります。未指定項目の扱いをAPI仕様で明確にしておくことが重要です。
PATCHはリソースの一部だけを更新したいときに使います。変更したい項目だけ送る設計と相性がよいです。
PATCH /users/1 HTTP/1.1
Host: api.example.com
Content-Type: application/json
{
"name": "Suzuki"
}
部分更新のルールを明示しないと利用者が混乱しやすくなります。null を送る意味や未指定項目の扱いを明確にしておきましょう。
DELETEはリソースを削除するためのメソッドです。成功時に本文を返さず 204 No Content を使う設計もよくあります。
DELETE /products/10 HTTP/1.1
Host: api.example.com
Authorization: Bearer xxxxxx
物理削除か論理削除かを利用者が理解できるようにし、すでに存在しない対象を削除したときの扱いも決めておくことが重要です。
「実装しやすいメソッド」ではなく、「読んだときに意味が伝わるメソッド」を選ぶことが重要です。
| やりたいこと | 推奨されやすいメソッド | 理由 |
|---|---|---|
| 商品一覧を取る | GET /products | 取得だから |
| 商品詳細を取る | GET /products/1 | 取得だから |
| 商品を新規登録する | POST /products | 新しいリソース作成だから |
| 商品全体を更新する | PUT /products/1 | 全体更新だから |
| 商品名だけ変える | PATCH /products/1 | 部分更新だから |
| 商品を削除する | DELETE /products/1 | 削除だから |
HTTPメソッドを適切に使わないと、APIが読みにくくなり、キャッシュや監視、権限制御でも不利になります。
避けたい例:
POST にするGET で行うPUT と PATCH の使い分けが曖昧/createUser、/deleteProduct)必ずしも絶対禁止ではありませんが、REST的な読みやすさや標準的な期待との相性は下がりやすいです。
ステータスコードは3桁の数字で、成功・リダイレクト・クライアントエラー・サーバーエラーを大きく分類できます。まずは1xx〜5xxの意味をざっくり把握するだけでも十分役立ちます。
| 分類 | 範囲 | 意味 |
|---|---|---|
| 1xx | 100〜199 | 処理継続中の情報 |
| 2xx | 200〜299 | 成功 |
| 3xx | 300〜399 | リダイレクト |
| 4xx | 400〜499 | クライアント側の問題 |
| 5xx | 500〜599 | サーバー側の問題 |
最初に実務で特に重要なのは、2xx、4xx、5xxです。
2xxは成功を表しますが、成功の中にも意味の違いがあります。200だけで済ませず、201や204も使い分けるとAPIの意図が伝わりやすくなります。
| コード | 意味 | よくある場面 |
|---|---|---|
200 OK | 一般的な成功 | 取得成功、更新成功 |
201 Created | 作成成功 | 新規リソース作成 |
204 No Content | 成功だが本文なし | 削除成功、本文不要の更新成功 |
HTTP/1.1 200 OK
Content-Type: application/json
{"id":1,"name":"Keyboard"}
新しいリソースを作成したことを明確に伝えたいときに使います。POSTでの新規作成と相性がよいコードです。
HTTP/1.1 201 Created
Content-Type: application/json
Location: /products/101
{"id":101,"name":"Keyboard"}
成功したが、返す本文がないことを示します。削除や単純更新でよく使われます。
HTTP/1.1 204 No Content
4xxは「クライアントからの要求に問題がある」ことを示します。特に400、401、403、404の違いは早めに整理しておくと調査がしやすくなります。
| コード | 意味 | よくある場面 |
|---|---|---|
400 Bad Request | リクエスト不正 | 必須項目不足、形式不正 |
401 Unauthorized | 認証が必要 | トークンなし、期限切れ |
403 Forbidden | 認証済みだが権限不足 | 管理者専用APIへ一般ユーザーがアクセス |
404 Not Found | 対象が見つからない | URL誤り、存在しないID |
405 Method Not Allowed | メソッド不正 | GETしかないURLにPOSTした |
409 Conflict | 状態競合 | 重複作成、更新競合 |
415 Unsupported Media Type | 本文形式が不正 | Content-Type が不正 |
422 Unprocessable Content | 形式は正しいが意味的に不正 | バリデーションエラー |
厳密な使い分けは実装方針によりますが、400は構文や基本条件の不正、422は意味的なバリデーション失敗として整理すると扱いやすいです。
400 の例: JSONが壊れている、必須パラメータ自体が欠けている422 の例: メールアドレス形式は正しいが業務ルール違反、価格が負数で登録不可実務では422を使わず400に寄せるAPIもあります。重要なのは、プロジェクト内で一貫性を持つことです。
401は「認証されていない」、403は「認証されているが許可されていない」と考えると整理しやすいです。
| コード | 状態 | 例 |
|---|---|---|
401 | 認証が足りない | トークン未送信、期限切れ |
403 | 権限が足りない | 一般ユーザーが管理画面APIへアクセス |
404は「そのURLや対象が見つからない」ことを示します。認可都合であえて404を返す設計もあります。
単純な例: /products/9999 に対象が存在しない、URLスペルが間違っている
一方で、存在の有無を秘匿するために、本当は権限不足でも404を返す設計もあります。そのため、仕様とセキュリティ方針をセットで見る必要があります。
5xxはサーバー側で正常に処理できなかったことを示します。利用者の入力よりも、アプリケーションやインフラの問題を疑う場面です。
| コード | 意味 | よくある場面 |
|---|---|---|
500 Internal Server Error | サーバー内部エラー | 例外、想定外障害 |
502 Bad Gateway | 上流サーバー不正 | リバースプロキシ先の異常 |
503 Service Unavailable | 一時的に利用不可 | メンテナンス、過負荷 |
504 Gateway Timeout | 上流応答待ちタイムアウト | バックエンド遅延 |
利用者側でまず見るポイント: いつから発生したか、全リクエストで起きるか、特定エンドポイントだけか、アプリログやプロキシログに何が出ているか
メソッド単体ではなく、「どのメソッドに対してどのステータスコードが返るか」でAPIの意味が完成します。
| 操作 | 例 | 成功時によくあるコード |
|---|---|---|
| 一覧取得 | GET /products | 200 |
| 詳細取得 | GET /products/1 | 200 |
| 新規作成 | POST /products | 201 |
| 全体更新 | PUT /products/1 | 200 or 204 |
| 部分更新 | PATCH /products/1 | 200 or 204 |
| 削除 | DELETE /products/1 | 204 |
# 取得
curl -i https://api.example.com/products/1
# 作成
curl -i \
-X POST \
-H "Content-Type: application/json" \
-d '{"name":"Keyboard","price":5000}' \
https://api.example.com/products
# 削除
curl -i \
-X DELETE \
https://api.example.com/products/1
出力を見るときは、まず次を確認します。
Content-Type や Location も見るメソッドとステータスコードは、仕様だけでなく実装・運用で崩れやすいポイントです。違和感のある設計は後で利用者を混乱させます。
| つまずき | よくある原因 | 見直しポイント |
|---|---|---|
更新APIなのに GET を使っている | 画面都合で設計した | 副作用の有無で見直す |
作成成功なのに常に 200 | 実装簡略化 | 201 を使う意味を検討する |
| 認証エラーと権限エラーが混在 | 401/403の整理不足 | 認証と認可を分ける |
バリデーション失敗が全部 500 | 例外処理不足 | 4xxへ適切に変換する |
全部 POST に統一されている | API設計方針不在 | 操作意図ごとに分ける |
厳密な正しさだけでなく、「利用者が予測しやすいか」「プロジェクト全体で一貫しているか」を重視すると運用しやすくなります。
特に大切なのは、一度決めたルールをシリーズやAPI全体で揃えることです。
HTTPメソッドは操作の意図を、ステータスコードは処理結果を表します。GET、POST、PUT、PATCH、DELETEの違いと、2xx、4xx、5xxの意味を押さえるだけで、HTTPの読み書きの精度は大きく上がります。
GET は取得、POST は作成や処理実行、PUT は全体更新、PATCH は部分更新、DELETE は削除200、201、204 の使い分けが重要400、401、403、404、409、422、500 などの意味を区別する読み終えたら完了にしましょう
完了ボタンを押すと、モジュール「HTTP入門」の進捗として記録されます。 読んだ内容を振り返るときにも役立ちます。