データベースにアクセスする RESTful Web サービスを実装しています。データベース内のエンティティは、複数の更新を検出するためにバージョン管理されています。たとえば、現在の値が{"name":"Bill", "comment":"tinker", "version":3}
の場合、1 人のユーザーが PUTを実行{"name":"Bill", "comment":"tailor", "version":3}
すると、リクエストは成功し (200 OK)、新しい値は になります{"name":"Bill", "comment":"tailor", "version":4}
。2 番目のユーザーが{"name":"Bill", "comment":"sailor", "version":3"}
その要求を PUT すると、バージョン番号が一致しないため、失敗します (409 競合)。
既存の非 RESTful インターフェイスがあるため、データベースの設計を変更することはできません。RESTful インターフェイスは、バージョン チェックの詳細を処理する既存のインターフェイスを呼び出します。
RESTful Web サービスの経験則は、可能な限り HTTP の詳細に従うことです。この場合、リクエストで条件付きヘッダーを使用し、バージョンが一致しない場合は 412 Precondition Failed を返す方がよいでしょうか? 適切なヘッダーは If-Match のようです。このヘッダーは、リソースの現在の状態の表現のハッシュである可能性がある ETag (エンティティ タグ) を取ります。
私がこれを行った場合、ETag は外観のためのものになります。なぜなら、バージョンはまだ私がテストしている本物だからです。
「よりRESTfulにする」以外に、これを行う必要がある理由はありますか?