【发布时间】:2010-09-01 16:31:38
【问题描述】:
我正在实现一个访问数据库的 RESTful Web 服务。对数据库中的实体进行版本控制以检测多个更新。例如,如果当前值为{"name":"Bill", "comment":"tinker", "version":3},如果一个用户PUTs{"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”之外,我还有什么理由应该这样做吗?
【问题讨论】:
标签: http rest http-status-code-412