RESTful服务中部分更新的最佳做法
我正在为客户管理系统编写一个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)','countCustomers()'
POST /customer/123?cmd=sendEmail
POST /cmd/sendEmail?customerId=123
GET /customer/count
谢谢弗兰克
你基本上有两个选择:
使用PATCH
(但请注意,您必须定义自己的媒体类型,指定准确发生的事情)
将POST
用于子资源并返回303请参阅其他,其中包含指向主资源的位置标题。 303的意图是告诉客户:“我已经执行了你的POST,结果是其他资源已经更新了,请参阅位置标题的资源。” POST / 303旨在迭代添加资源以建立一些主要资源的状态,它非常适合部分更新。
您应该使用POST进行部分更新。
要更新客户123的字段,请向/ customer / 123发送POST。
如果您只想更新状态,您也可以将其设置为/ customer / 123 / status。
通常,GET请求不应该有任何副作用,并且PUT用于写入/替换整个资源。
这直接来自HTTP,如下所示:http://en.wikipedia.org/wiki/HTTP_PUT#Request_methods
您应该使用PATCH进行部分更新 - 使用json-patch文档(请参阅http://tools.ietf.org/html/draft-ietf-appsawg-json-patch-08或http://www.mnot.net/博客/ 2012/09/05 /补丁)或XML补丁框架(参见http://tools.ietf.org/html/rfc5261)。 在我看来,json-patch最适合您的业务数据。
具有JSON / XML补丁文档的PATCH对于部分更新具有非常前沿的语义。 如果您开始使用POST,并修改了原始文档的副本,对于部分更新,您很快会遇到希望缺失值(或者更确切地说,空值)代表“忽略此属性”或“将此属性设置为空值“ - 并导致黑客攻击解决方案的漏洞,最终会导致您自己的补丁格式。
你可以在这里找到更深入的答案:http://soabits.blogspot.dk/2013/01/http-put-patch-or-post-partial-updates.html。
链接地址: http://www.djcxy.com/p/7919.html上一篇: Best practice for partial updates in a RESTful service
下一篇: YAML mime type?