【发布时间】:2014-12-15 12:31:04
【问题描述】:
我有一个支持两个对象的 RESTful API,因此对象 A 包含嵌套对象 B 的有序列表:
Create object A - POST /a
Create object B and add to A - POST /a/<id>/b
Update object B in A - PATCH /a/<id>/b/<id>
什么是更新特定 A 中 B 对象顺序的 RESTful 方式?
选项 1: PATCH /a/<id> 用 json 内容替换 A.BsA 有一个嵌入的 Bs 列表,即 A.Bs,因此您可以替换该列表在整个过程中也改变了顺序。这依赖于客户端正确地重新提交整个列表。
选项 2: PATCH /a/<id> 用 json 内容替换 A.B_order
添加一个单独的B id 列表并让客户端更新它。这类似于选项 1,但不依赖于客户端重新提交所有对象。它确实需要服务器管理列表,在创建 B 时对其进行更新,并验证更新包含列表顺序更新时所需的所有 B id。
选项 3: PATCH /a/<id>/b 用 json 内容替换 A.Bs
与选项 1 相同,但 URL 不同
哪个最 RESTful 和清晰?
还有其他选择吗?
【问题讨论】:
-
顺便说一句,我使用
PATCH进行部分更新,而不是PUT替换整个对象 -
为什么不改为 POST 呢?
-
@richard POST 也可用于此类情况,但 PATCH 比 POST 更具体/语义正确,因此更适合。
-
我仍在试图找出restful-url 和普通的区别,因为对我来说它们实际上是相同的。这样,客户端不应该解释 URI,而只是将它们用作指向资源的指针。与通常的看法相反,URI 本身不包含任何路径逻辑,应该作为一个整体使用。您当然可以通过提供一组 URI 来“伪造”路径逻辑,这些 URI 总体上形成了一个可遍历的图。 HTTP 允许通过 PATCH 或 PUT 更新重叠资源进行部分更新。这具有对实际资源进行部分更新的效果
-
然而,与 PUT 不同的是,PATCH 实际上是一种客户端可以用来向服务器发送有关如何将当前资源修改为所需状态的分步指令的方法。客户端实际上是在告诉服务器如何转换资源而不是呈现最终输出。还需要所有指令都成功完成或根本不应用它们,这需要操作的一些事务性要求。正如 Eric 和 Evert 已经提出的那样,我也建议使用 JsonPatch 因此
标签: rest http nested restful-url restful-architecture