アプリケーションのバックエンドと連携するために使用される REST API があります。競合防止機能を実装する必要があります。これは、編集要求 (POST/PUT) で、クライアントが最後に読み取ってから現在までにレコードが変更されていないかどうかを確認し、変更されている場合はクライアントに競合があることを通知します。
問題は、コンフリクト チェック タグ (タイムスタンプである可能性が最も高いですが、それを義務付けたくはありません) を送信する方法と、エラーを返す方法です。
可能な限り標準の REST パターンを使用したいので、ここで検討したソリューションは次のとおりです。
If-Modified-Since の使用。ここでの問題は、タイムスタンプの使用が義務付けられていることと、仕様では 412 を返さなければならないと述べていることです。仕様で説明されているように、編集の競合であることを示すために、より一般的なコードではなく、より具体的な 409 コードを返したいと考えています。412 他の理由で発生する可能性があります。これにより、専用のエラー コードが作成されるため、クライアントが編集の競合に対して特別な処理を行うことがはるかに容易になります。
If-Match の使用。添付された任意のデータを使用できるため、より優れていますが、仕様では、409 の方が適切であるにもかかわらず、412 を使用することが義務付けられています。また、仕様では If-Match が Etags にリンクされていることが示唆されており、すべてのレコードに対して適切な Etag を計算することは現実的ではないため、データに Etags を使用していません。レコード データの一部としてチェックに使用するタグがありますが、これは ETag として送信されず、既存のクライアントは ETag を処理しないため、可能であればクライアントにこの新しい要件を課したくありません。
カスタム X-Header の使用。これは問題なく機能し、クライアントが追加するのは非常に簡単ですが、可能であれば標準の REST 手段を使用することをお勧めします。
では、この場合の推奨される方法は何ですか? 標準の REST 手段を使用して 409 で応答し、すべてをきれいに処理する方法はありますか?