何が起きたのか?
428 は「『誰も先に書き換えていないこと』を確かめずに更新しようとしないでください」というサインです。 教室で言えば、共有ノートに新しい答えを書く前に「自分が見たときと内容が変わっていないか」を確認するのがクラスのルール、それを飛ばして書こうとしたら先生に止められた——そんな場面です。
412 は「条件を確かめたが満たされなかった」状態で、428 は「そもそも条件を確かめずに来た」状態です。サーバーは安全のため「条件付きリクエストにしてからやり直してください」と返します。
黒板からのひとこと
班ノートの編集ルールを「最新を確認してから書く」と決めた教室では、先生は誰かが確認なしで更新しようとしたら手を止めさせます。「壊してしまう前に、必ず最新を見てね」と。これは生徒を疑っているのではなく、共同作業を成り立たせる仕組みです。
428 もそれと同じで、共同編集や同時更新が起きやすい場所では「無条件の上書きはしない」というルールが敷かれています。If-Match ヘッダなどを添えてやり直せば、安全に更新できます。
解決への歩み
大丈夫、次はこうしてみよう:
- GET でリソースと ETag を取得:最新の状態と ETag を手元に置く
- If-Match に ETag を入れて再送:取得した ETag をそのまま付ける
- クライアントで ETag を保持する仕組み:取得時に保存し、更新時に必ず添付する
- 必須化の仕様を整理(管理者向け):どのエンドポイントで ETag 必須か、エラー応答に手順を含める
実際にはこう見える
$ リクエスト
curl -i https://example.com/some/path ↓ レスポンス
HTTP/1.1 428 Precondition Required
Content-Type: text/html; charset=utf-8
<!DOCTYPE html>
<html><body><h1>428 Precondition Required</h1></body></html>