【发布时间】:2011-01-27 10:49:20
【问题描述】:
我正在为客户管理系统编写一个 RESTful 服务,并试图找到部分更新记录的最佳实践。例如,我希望调用者能够通过 GET 请求读取完整记录。但是为了更新它,只允许对记录进行某些操作,例如将状态从 ENABLED 更改为 DISABLED。 (我有比这更复杂的场景)
出于安全原因,我不希望调用者仅使用更新的字段提交整个记录(这也感觉有点矫枉过正)。
是否有推荐的构建 URI 的方法?在阅读 REST 书籍时,似乎不赞成 RPC 风格的调用。
如果以下调用返回 id 为 123 的客户的完整客户记录
GET /customer/123
<customer>
{lots of attributes}
<status>ENABLED</status>
{even more attributes}
</customer>
我应该如何更新状态?
POST /customer/123/status
<status>DISABLED</status>
POST /customer/123/changeStatus
DISABLED
...
更新:增加问题。如何将“业务逻辑调用”合并到 REST api 中?有没有商定的方式来做到这一点?并非所有方法本质上都是 CRUD。有些更复杂,例如 'sendEmailToCustomer(123)'、'mergeCustomers(123, 456)'、'counterCustomers()' p>
POST /customer/123?cmd=sendEmail
POST /cmd/sendEmail?customerId=123
GET /customer/count
【问题讨论】:
-
要回答您关于“业务逻辑调用”的问题,这里有一篇来自 Roy Fielding 本人的关于
POST的帖子:roy.gbiv.com/untangled/2009/it-is-okay-to-use-post 其中的基本思想是:如果没有方法(例如GET或PUT) 非常适合您的操作使用POST。 -
这几乎就是我最终所做的。使用 GET、PUT、DELETE 进行 REST 调用以检索和更新已知资源。 POST 用于添加新资源,POST 带有一些用于业务逻辑调用的描述性 URL。
-
无论您决定什么,如果该操作不是 GET 响应的一部分,那么您就没有 RESTful 服务。我这里没看到
标签: rest