【发布时间】:2010-07-07 21:47:30
【问题描述】:
我正在构建一个 RESTful 资源集合,其工作方式如下:(我将使用“人”作为示例):
获取/人/{key} - 返回一个人对象(JSON) GET /people?first_name=鲍勃 - 返回“first_name”为“Bob”的人员对象列表(JSON) 放/人/{键} - 期望有效负载 (JSON) 中的人员对象,更新人员 具有在 URL 参数中找到的 {key} 的数据存储以匹配有效负载。 如果是新对象,客户端指定新对象的键。到目前为止,我对设计感到非常满意(尽管欢迎任何意见/批评)。
我还希望能够列出人员列表,但是我对我的设计的 RESTfulness 没有信心。这就是我的想法:
放/人 - 期望 JSON 形式的对象列表,其中包含对象中的键 (“键”:“32948”)。更新数据存储中的所有相应对象。这个操作是幂等的,所以我想使用“PUT”。但是它违反了规则,因为对同一资源的 GET 请求不会返回与客户端刚刚 PUT 的等效内容,而是会返回所有“人”对象(因为查询中没有过滤器)。我怀疑这里还有一些其他规则可能被打破。
有人在我之前的一个问题中提到了“PATCH”请求的使用:REST resource with a List property
“PATCH”听起来很棒,但我不想使用它,因为它还没有被广泛使用,并且还不能与很多程序和 API 兼容。
我不想使用 POST,因为 POST 意味着请求不是幂等的。
有没有人有任何cmets/建议?
跟进:::
虽然我犹豫是否使用 POST,因为它似乎是 RESTful 操作的最小公分母,并且可以说更多关于此操作(特别是它是幂等的),但不能使用 PUT,因为它的要求太窄了。具体来说:资源没有被完全重写,等效资源没有从 GET 请求发送回相同的资源。当应用程序、api 和/或程序员尝试使用资源并遇到来自资源的意外行为时,使用具有超出其规范的属性的 PUT 可能会导致问题。
除了接受的答案之外,Darrel Miller 有一个很好的建议,如果操作绝对必须是 PUT,那就是将 UUID 附加到资源路径的末尾,这样等效的 GET 请求将返回等效的资源。
【问题讨论】:
标签: rest