我正在为客户管理系统编写RESTful服务,并且试图找到最佳方式来部分更新记录。例如,我希望调用者能够通过GET请求读取完整记录。但是为了进行更新,仅允许记录上的某些操作,例如将状态从“启用”更改为“禁用”。(我有比这更复杂的场景)
出于安全原因,我不希望呼叫者仅使用更新的字段来提交整个记录(这也感觉像是过大了)。
有没有推荐的方法来构造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) ”,“ countCustomers() ”
POST /customer/123?cmd=sendEmail
POST /cmd/sendEmail?customerId=123
GET /customer/count
POST
Roy Fielding自己写的一篇帖子:roy.gbiv.com/untangled/2009/it-is-okay-to-use-post,其基本思想是:如果没有并非最适合您的操作使用的方法(例如GET
或PUT
)POST
。