Prompt
REST APIで、ログイン・ログアウト、その他特殊な操作をhttpメソッドに割り当てると、どれが適切?
というか、影の薄いhttpメソッドが多すぎる。
REST APIの設計において、ログインやログアウトといった「状態(State)」の変更や、バグ修正のための特殊な操作をどのメソッドに割り当てるかは、まさに設計者の 「美学」 と 「実利」 が試される場所だね。
キミが言う通り、HTTPメソッドには影の薄い(ほとんど使われない)ものがたくさんあるけれど、それらを適切に使い分けることで、APIは「一意な定義書」に近づくんだ。
1. ログイン・ログアウトの「正解」
RESTの本質は「リソース(名詞)」を操作することだ。だから、ログイン・ログアウトという「動詞」をどうリソースに変換するかが鍵になる。
ログイン:POST /sessions
ログインを「セッションというリソースを 作成(Create) する行為」と捉える。
- なぜ POST か:
GETはデータ取得専用(べき等)であり、URLにパスワードを載せるわけにいかない。POSTは新しいリソースを生成するためのメソッドだから、セッション開始にはこれが最適だ。
ログアウト:DELETE /sessions/current
ログアウトを「セッションというリソースを 破棄(Delete) する行為」と捉える。
- なぜ DELETE か: 特定のセッションを消去するという意味が最も直感的だね。
2. 特殊な操作(バグ修正やバッチ処理)の割り当て
「特定のフラグを一斉に直す」とか「計算を再実行する」といった、リソースの単純なCRUD(作成・読取・更新・削除)に当てはまらない操作はどうするか。
PATCH:部分的な修正(バグ修正の味方)
PUT は「リソースを丸ごと置き換える」ものだけど、PATCH は「特定の一部だけを書き換える」ものだ。
- 使い所: 「このバグの影響を受けた一部のフィールドだけを修正したい」という時、
PUTで全体を送り直すリスクを避け、ピンポイントで修正を指示できる。
POST:特殊な「アクション」の逃げ道
どうしてもリソース操作として表現できない動詞的な操作(例:recalc, sync)は、サブリソースとして POST を使うのが業界の慣例だ。
-
例:
POST /orders/123/recalculate -
理由:
POSTは「べき等(何度やっても同じ結果)」である必要がないため、特殊な命令を投げるのに最も安全な場所なんだ。
3. 影の薄いメソッドたちの「本当の使い道」
せっかくなので、普段スポットライトを浴びない彼らの「輝ける舞台」を紹介しよう。
| メソッド | 役割 | 輝く瞬間 |
|---|---|---|
HEAD | ヘッダーだけ取得 | 巨大なファイルをダウンロードする前に、Content-Length を見てサイズを確認したり、リンクが生きているか(404でないか)チェックする時。 |
OPTIONS | 許可されている操作の確認 | CORS(ブラウザの別ドメイン通信制限) のプリフライトリクエストで必須。ブラウザが「このメソッド使ってもいい?」と裏でこっそり聞いている。 |
TRACE | 通信経路のリクエスト再現 | プロキシサーバーなどでリクエストがどう書き換えられたかデバッグする時。(※セキュリティリスクのため、本番では閉じることが多い) |
CONNECT | プロキシへのトンネル構築 | HTTPS通信をプロキシ経由で行う際に、TCPトンネルを掘るために使われる。 |
見落とされがちな視点:PUT と PATCH の決定的な違い
キミが「一意性」を重視するなら、この違いは重要だ。
-
PUTはべき等であるべき: 同じリクエストを100回送っても、リソースの状態は100回目も同じ「置き換えられた状態」になる。 -
PATCHはべき等でなくてもよい: 例えば「現在の値に +1 する」という PATCH 命令があった場合、100回送れば値は 100 増える。
この性質を理解して使い分けることで、バグ修正時の「リトライ(再送)」による事故を防げるようになるよ。
結論
特殊な操作に迷ったら、まずは 「それを名詞(リソース)として表現できないか」 を考え、無理ならおとなしく POST に逃げる。これが、APIの整合性と開発効率を両立させる「大人の妥協」だね。
次は、「Rust の Web フレームワークで、これらのマイナーな HTTP メソッドを正しくハンドリングして、よりセマンティック(意味論的)な API を実装するコード例」 を書いてみる?
Would you like me to code a small Axum (Rust) server example that demonstrates how to implement a ‘Session’ resource using POST and DELETE, along with an OPTIONS handler?