【发布时间】:2011-09-11 04:31:30
【问题描述】:
看起来有两种方法可以制作我的 REST API。我可以在不指定 URI 的情况下使用 POST 创建用户,它将创建用户并返回 URI,或者我可以使用 PUT 创建用户并指定 URI他们自己。
什么时候应该使用一个而不是另一个?这里的关键区别在于,在一种方法中,我的系统决定了资源的唯一 ID 和 URI 应该是什么,而在另一种情况下,他们在我创建时指定它应该是什么。
【问题讨论】:
看起来有两种方法可以制作我的 REST API。我可以在不指定 URI 的情况下使用 POST 创建用户,它将创建用户并返回 URI,或者我可以使用 PUT 创建用户并指定 URI他们自己。
什么时候应该使用一个而不是另一个?这里的关键区别在于,在一种方法中,我的系统决定了资源的唯一 ID 和 URI 应该是什么,而在另一种情况下,他们在我创建时指定它应该是什么。
【问题讨论】:
这基本上归结为您是否愿意将资源命名的控制权交给客户端。
最大的问题就是处理冲突(如果我 PUT /photo.png 而你 PUT /photo.png,可以吗?)。
回答这些问题,你就上路了。
【讨论】:
当您的用户指定资源 ID 时,他们可以 PUT 到 URI;他们执行 PUT 的 ID 是资源 ID 的规范。
当你指定资源ID时,它们可以POST到父/组的URI;您的系统将为资源分配一个 URI,并将其返回给客户端,以便他们可以引用他们创建的资源。
【讨论】:
这个问题的答案取决于两个更具体的问题:
如果这两个问题的答案都是“是”,那么 PUT 可能是合适的。如果您对其中任何一个都回答“否”,那么您应该坚持使用 POST。
【讨论】:
我可以使用 POST 创建用户 不指定 URI,它会 创建用户并返回 URI 或 我可以创建用户 PUT 并自行指定 URI。
什么时候应该使用 其他的?
使用第一个。
在 RESTful HTTP 中,客户端应该从不构造 URI。服务应该连接良好,这意味着客户端应该只遵循服务器提供的 URI 并向这些 URI 发出请求。
它在客户端和服务器之间创建了更好的分离,并且可以更轻松地更改服务而不破坏现有客户端。
(是的,很多个现有 API 都犯了这个错误)
Fielding 有一篇与此主题相关的非常好的帖子:
http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven
【讨论】: