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?