何が起きたのか?
412 は「『まだ書き換えられていなかったら更新して』と頼んだのに、もう誰かが書き換えていた」というサインです。 教室で言えば、黒板の答えが消されていないことを確かめてから書き直そうとしたら、隣の席の子がすでに新しい答えを書き終えていた——そんな状況に近いです。
If-Match や If-Unmodified-Since のような「条件付きリクエスト」を投げたとき、その条件がサーバー側の今の状態と合わなければ 412 が返ります。データを上書きで壊さないための、安全弁としての応答です。
黒板からのひとこと
授業で「自分が見た時点の答えがそのまま残っていたら、続きを書く」と取り決めをしておくと、複数人で同じノートを編集するときに事故が減ります。誰かが先に更新していたら、その時点で手を止めて確認する——412 はその合図です。
サーバーは断っているのではなく、「いったん最新を見てから、もう一度判断してね」と促しています。最新版を取り直してから、競合した部分を確認して書き直すのが基本の流れです。
解決への歩み
大丈夫、次はこうしてみよう:
- 最新の ETag や更新日時を取り直す:GET でリソースを再取得し、新しい値を取得
- 差分を確認:他者の変更を上書きしてしまっていないか、必要ならマージ
- 再送時に新しい If-Match を指定:取り直した最新の ETag を渡して再リクエスト
- 競合検知の方針を整理(管理者向け):弱い ETag の扱い、リトライ手順、利用者向けエラーメッセージを整える
実際にはこう見える
$ リクエスト
curl -i https://example.com/some/path ↓ レスポンス
HTTP/1.1 412 Precondition Failed
Content-Type: text/html; charset=utf-8
<!DOCTYPE html>
<html><body><h1>412 Precondition Failed</h1></body></html>