我正在实现一个访问数据库的 RESTful Web 服务。对数据库中的实体进行版本控制以检测多个更新。例如,如果当前值为{"name":"Bill", "comment":"tinker", "version":3}
,如果一个用户 PUT {"name":"Bill", "comment":"tailor", "version":3}
,则请求将成功(200 OK),新值为{"name":"Bill", "comment":"tailor", "version":4}
。如果第二个用户 PUT{"name":"Bill", "comment":"sailor", "version":3"}
请求将失败(409 冲突),因为版本号不匹配。
现有的非 RESTful 接口,因此无法更改数据库的设计。RESTful 接口调用一个现有的接口来处理检查版本的细节。
RESTful Web 服务的经验法则是尽可能遵循 HTTP 的细节。在这种情况下,如果版本不匹配,在请求中使用条件标头并返回 412 Precondition Failed 会更好吗?适当的标题似乎是 If-Match。此标头采用 ETag(实体标签),它可以是资源当前状态表示的哈希值。
如果我这样做,ETag 将是为了外观,因为版本仍然是我正在测试的真实内容。
除了“让它更加 RESTful”之外,我有什么理由这样做吗?