「消したはずなのにエラー?」HTTP/1.1のDELETEメソッドと冪等性の深い話
こんにちは!ネットワークの世界へようこそ。
Webブラウザで何かを表示する時、裏側では「HTTP」というプロトコル(通信のお約束)が猛スピードで走り回っています。今日はその中でも、ちょっと扱いが繊細な「DELETEメソッド」について、一緒に紐解いていきましょう。
「データを消す」という行為、現実世界ならゴミ箱に捨てるだけですが、ネットワークの世界ではもう少しだけお行儀の良いルールがあるんです。
—
1. そもそも「冪等性(べきとうせい)」って何?
HTTPメソッドを語る上で避けて通れないのが「冪等性(Idempotency)」という言葉。漢字ばかりで難しく見えますよね。でも、考え方はとてもシンプルです。
「何回同じ操作をしても、結果が(副作用的に)同じであること」
これを指します。例えば:
- GET(取得): 何回同じページを読み込んでも、中身は変わりませんよね。これは冪等です。
- POST(投稿): 掲示板に同じ内容を5回投稿したら、5つの記事が並んでしまいますよね。これは冪等ではありません。
では、今回の主役DELETEはどうでしょうか?
—
2. DELETEメソッドと冪等性の関係
結論から言うと、DELETEは「冪等」です。
郵便配達に例えてみましょう。
あなたは「私の住所のポストの中身を空にしてください」という手紙を出しました。配達員は中身を捨てて、ポストを空にします。
では、次に同じ手紙を出したらどうなるでしょう?
配達員はポストを見ますが、既に空なので「あ、もう空だ」と確認して帰るだけですよね。
「消しに行く」という操作を何回繰り返しても、「そのリソースが存在しない状態」という結果に落ち着く。 だから、DELETEは冪等なんです。
—
3. 現場で迷う「ステータスコード」の選び方
さて、ここからがエンジニアの腕の見せ所です。
「データを消せ!」と命令した時、サーバーはどんな顔で返事をすべきでしょうか? HTTP/1.1の仕様では、主に以下のコードが使われます。
成功した時:200 OK または 204 No Content
- 200 OK: 「消したよ!これが消したデータの詳細だよ」と、削除後のメッセージを返したい時に使います。
- 204 No Content: 「消したよ!もう中身は何もないから、返事も特になし!」というスッキリした返答です。REST APIの現場ではこちらが好まれることが多いですね。
既に存在しない時:404 Not Found
ここが議論の分かれ道です。「既に消えているもの」をDELETEしようとした時、エラー(404)を返すのが一般的です。
「えっ?冪等なら、何度叩いても成功(200)でいいんじゃないの?」と思うかもしれません。しかし、多くのシステムでは「消そうとしたターゲットが見当たらない」という事実は、クライアントに「指定したパスが間違っているかもよ?」と教えてあげる親切心から、404を返す設計が推奨されています。
—
4. 実装のイメージ(サンプルコード)
実際に、Webサーバー側でDELETEを受け取った時の動きを擬似コードで見てみましょう。
// DELETEリクエストが来た時のサーバーの心構え
app.delete(‘/items/:id’, (req, res) => {
const item = database.find(req.params.id);
// 1. もしデータが見つからなかったら
if (!item) {
// 「そもそも対象が存在しません」と伝える(404)
return res.status(404).send(‘対象が見当たりません’);
}
// 2. データがあれば削除を実行
database.remove(req.params.id);
// 3. 削除成功!「もう何もないよ」と伝える(204)
return res.status(204).send();
});
—
まとめ:ネットワークの作法は「相手への優しさ」
DELETEメソッドにおける「冪等性」は、単なるプログラミングの理屈ではありません。
「何度リクエストを送っても、システムの最終状態が壊れない」という安心感を担保するためのものなのです。
- DELETEは冪等である(何度繰り返しても「消えている状態」になる)
- 成功時は204 No Contentがスマート
- 存在しない場合は404で優しく教えてあげる
これらを守るだけで、あなたの書くAPIはグッと信頼性が高まり、他のエンジニアからも「おっ、わかってるね!」と言われるはずです。
ネットワークの通信は、まるで手紙のやり取りです。相手にどう伝われば一番気持ちいいか。そんな視点を持つと、プロトコルの学習もぐっと楽しくなりますよ。また次回お会いしましょう!
コメント