リクエストは条件付きである必要があります。
使いどころ
更新時に If-Match を必須にして、書き込みの消失を防ぐ場合。
よくある原因と対処法
428 は、ここでは条件付きリクエストしか受け付けないことをクライアントに伝えます。最後に読み取った ETag を If-Match で送ることで、同時編集が互いを黙って上書きしてしまう「更新の消失(lost update)」問題を防ぎます。428 を受け取ったクライアントは、リソースを GET して ETag ヘッダーを取得し、If-Match 付きで PUT や PATCH を再送します。その時点で ETag が古くなっていれば、応答は 412 になります。
API を設計する立場では、更新の消失が問題になる場所でのみこれを必須にし、ドキュメントに明記してください。ほとんどの HTTP クライアントは自分から条件付きヘッダーを送らないからです。すべての GET と成功した書き込みで現在の ETag を返します。プロキシが 428 を生成することはなく、必ずアプリケーションから返されます。CDN や圧縮が ETag を書き換えないようにしてください。そうでないと If-Match が一致することはありません。
クライアントエラー (4xx)
4xx はクライアントエラーです。リクエスト自体が誤っている、認証されていない、または存在しないものを指しています。同じリクエストを再試行しても解決しません。
レスポンスでの表示
HTTP/1.1 428 Precondition Required返し方
| Node.js / Express | res.status(428).end() |
|---|---|
| Python / Flask | return '', 428 |
| nginx | return 428; |
確認方法
curl -s -o /dev/null -w "%{http_code}\n" https://example.com/