HTTPメソッド — GET・POST・PUT・DELETEの使い分け
この章の目次開く
HTTPリクエストには必ず メソッド が含まれます。メソッドは「このリクエストで何をしたいのか」をサーバーに伝える動詞のようなものです。
この章では、Web APIで使う主要なHTTPメソッドの意味と使い分け、そして設計で重要になる べき等性 と 安全性 の概念を整理します。
学習者データを送るのはとりあえず全部 POST でいい気がするけど…GET や PUT ってわざわざ使い分ける必要あるの?
主要なHTTPメソッド

最もよく使う4つのメソッドは、CRUDの各操作に対応します。
| メソッド | 意味 | CRUD | 例 |
|---|---|---|---|
GET | リソースの取得 | Read | ユーザー情報を取得する |
POST | リソースの作成 | Create | 新しいユーザーを登録する |
PUT | リソースの全体更新 | Update | ユーザー情報を丸ごと書き換える |
DELETE | リソースの削除 | Delete | ユーザーを削除する |
GET /api/users/1 → ユーザー1の情報を取得
POST /api/users → 新しいユーザーを作成
PUT /api/users/1 → ユーザー1の情報を全体更新
DELETE /api/users/1 → ユーザー1を削除
その他のメソッド
上記4つに加えて、実務で登場するメソッドがいくつかあります。
| メソッド | 意味 | よくある使い方 |
|---|---|---|
PATCH | リソースの部分更新 | 名前だけ変える、ステータスだけ変える |
OPTIONS | サーバーが対応するメソッドの確認 | CORSのプリフライトリクエスト |
HEAD | GETと同じだがボディなし | リソースの存在確認、キャッシュチェック |
PUT と PATCH の違いは、PUTが「リソース全体を送り直す」のに対し、PATCHが「変更したいフィールドだけ送る」という点です。
PUT /api/users/1
{ "name": "Bob", "email": "bob@example.com", "role": "admin" }
// ← 全フィールドを送る
PATCH /api/users/1
{ "name": "Bob" }
// ← 変えたいフィールドだけ送る
安全性とべき等性
HTTPメソッドには 安全性(Safe) と べき等性(Idempotent) という2つの性質があります。API設計でメソッドを正しく選ぶための基準です。
安全性 — そのリクエストがサーバーの状態を変更しないこと。GETは安全、POSTは安全ではない。
べき等性 — 同じリクエストを何回送っても結果が同じであること。GETやPUTはべき等、POSTはべき等ではない。
| メソッド | 安全 | べき等 |
|---|---|---|
GET | はい | はい |
POST | いいえ | いいえ |
PUT | いいえ | はい |
DELETE | いいえ | はい |
PATCH | いいえ | いいえ |
なぜべき等性が重要なのか
ネットワークは不安定です。リクエストを送ったのにレスポンスが返ってこなかった場合、「サーバーに届いたのか、届かなかったのか」がわかりません。
べき等なメソッド(GET、PUT、DELETE)なら、もう一度同じリクエストを送っても問題ない ので安全にリトライできます。POSTは送り直すと2件作成される可能性があるため、リトライには工夫が必要です。
GETリクエストの原則
GETは最も頻繁に使われるメソッドです。いくつかの重要な原則があります。
1. GETでデータを変更してはいけない
// NG — GETで削除処理
GET /api/users/1/delete
// OK — DELETEメソッドを使う
DELETE /api/users/1
GETは検索エンジンのクローラーやブラウザのプリフェッチが自動的に送ることがあります。GETで副作用がある操作を作ると、意図せずデータが変更される危険があります。
2. パラメータはクエリ文字列で渡す
GET /api/users?page=2&limit=20&sort=name
GETにはリクエストボディを含めないのが慣例です。技術的には可能ですが、多くのHTTPクライアントやプロキシがGETのボディを無視するため、実務では避けます。
3. クエリパラメータはURLエンコードする
// NG — 空白や日本語をそのまま入れている
GET /api/articles?keyword=HTTP 入門&category=基礎&応用
// OK — URLで安全に扱える文字に変換する
GET /api/articles?keyword=HTTP%20%E5%85%A5%E9%96%80&category=%E5%9F%BA%E7%A4%8E%26%E5%BF%9C%E7%94%A8
URLでは、空白、日本語、&、=、? などの文字が特別な意味を持ったり、そのままでは安全に送れなかったりします。たとえば category=基礎&応用 をそのまま送ると、& が「次のパラメータの区切り」と解釈され、サーバーが値を正しく読み取れません。
JavaScriptでは URLSearchParams を使うと、値を自動でエンコードできます。
const params = new URLSearchParams({
keyword: 'HTTP 入門',
category: '基礎&応用',
});
fetch(`/api/articles?${params.toString()}`);
// /api/articles?keyword=HTTP+%E5%85%A5%E9%96%80&category=%E5%9F%BA%E7%A4%8E%26%E5%BF%9C%E7%94%A8手動で1つの値だけ変換する場合は encodeURIComponent() を使います。URL全体ではなく、パラメータの値ごと にエンコードするのが基本です。
POSTリクエストの使い方
POSTは新しいリソースを作成するときに使います。
POST /api/users
Content-Type: application/json
{
"name": "Alice",
"email": "alice@example.com"
}
レスポンスには通常 201 Created と、作成されたリソースの情報が返ります。
HTTP/1.1 201 Created
Location: /api/users/42
{
"id": 42,
"name": "Alice",
"email": "alice@example.com"
}
Location ヘッダーで作成されたリソースのURLを返すのが行儀の良いAPIです。
よくある誤用パターン
1. すべてPOSTで処理する
// NG — 全部POST
POST /api/getUser { "id": 1 }
POST /api/deleteUser { "id": 1 }
// OK — メソッドで意図を表現する
GET /api/users/1
DELETE /api/users/1
メソッドを正しく使うと、URLを見ただけで「何をするAPIか」がわかります。
2. GETで更新処理を行う
// NG — ブラウザのプリフェッチやクローラーでも実行される
GET /api/users/1/activate
状態を変える操作には POST、PUT、PATCH、DELETE を使います。
fetchで各メソッドを実際に使う
理論を押さえたら、実際のコードでHTTPメソッドを使い分けてみます。以下はブラウザの fetch APIでCRUD操作を行う典型的なパターンです。
// GET — データの取得
const users = await fetch('/api/users').then(res => res.json());
// POST — データの作成
const newUser = await fetch('/api/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'Alice', email: 'alice@example.com' }),
}).then(res => res.json());
// PUT — データの全体更新
await fetch('/api/users/42', {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'Bob', email: 'bob@example.com', role: 'admin' }),
});
// PATCH — データの部分更新
await fetch('/api/users/42', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'Bob' }),
});
// DELETE — データの削除
await fetch('/api/users/42', { method: 'DELETE' });DevToolsで確認する
Chrome DevToolsのNetworkタブでリクエストを選択すると、Method 列にHTTPメソッドが表示されます。「この操作はGETで飛んでいるのか、POSTで飛んでいるのか」を確認する習慣をつけると、APIの挙動をデバッグしやすくなります。
Networkタブの フィルター で method:POST と入力すると、POSTリクエストだけを絞り込めます。「意図しないGETが飛んでいた」「POSTのはずがGETになっていた」といったバグの発見に役立ちます。
まとめ
- HTTPメソッドは CRUD操作 に対応する: GET=Read、POST=Create、PUT/PATCH=Update、DELETE=Delete
- 安全性 はサーバーの状態を変えないこと、べき等性 は何回送っても同じ結果になること
- GETは データを変更しない・クエリパラメータをエンコードする・クエリ文字列に機密情報を入れない が原則
- POSTは べき等ではない ため、リトライには注意が必要
- メソッドを正しく使い分けることで、API全体の可読性と信頼性が上がる
次の章では、サーバーからの応答を読み解く HTTPステータスコード を詳しく見ていきます。