更新REST API中的单个属性

ski*_*kie 21 api rest

在设计新API时,我们正在尽力遵循REST建立的模式.我遇到的问题是尝试更新单个属性时要遵循的最佳方法.例如:

想象一下,你有一个简单的汽车资源:

{
   "make": "Chevrolet",
   "model": "Chevelle",
   "year": 1966,
   "color": "black",
   "for_sale": true
}
Run Code Online (Sandbox Code Playgroud)

我们假设该属性for_sale是您预期将由用户定期更新的内容.我有几个选择:

  1. PUTfor_sale设置为的整个资源false.对于一个相当小的资源,这似乎很好,但是,在大多数情况下,我们的资源非常大,因此在发送整个资源以更新单个(通常是已更改的)属性时会浪费很多.

  2. POST并通过仅包含要更新的元素进行部分更新,例如: {"for_sale":false}这样做更好,因为它需要更少的开销.

但我似乎在某种程度上寻求更简单的东西,但我似乎没有找到正确的方法.提供一个简单PUT的URL(不需要任何请求体)来更新这个属性会很方便.我看到谷歌在他们的API中做了什么来实现这一目标,但感觉有点像RPC-ish,尽管我喜欢简单.

POST /blogs/blogId/posts/postId/comments/commentId/approve (将评论标记为非垃圾邮件)

POST /blogs/blogId/posts/postId/comments/commentId/spam (将评论标记为垃圾邮件)

有人可以提供一些建议,以便采用遵循REST原则来更新资源中的单个属性(以优选的轻量级方式)的最佳方法吗?谢谢!

Eng*_*ery 12

实际上,我认为PATCH方法是专门为此目的而设计的.您应该使用它来提供对象的部分更新,而不是完整更新.这是一篇博客文章,可以更详细地解释这一点.

  • 我介绍了PUT与PATCH的争论,以及此博客文章中的"部分更新"主题:http://williamdurand.fr/2014/02/14/please-do-not-patch-like-an-idiot/ .基本上,它不是RESTful功能,但是部分更新仍然可以,而PATCH方法是最合适的解决方案. (4认同)
  • @WilliamDURAND正如你在博客中所说,你可以使用你想要的任何格式的补丁体 - 虽然rfc6902很好 - 假设所有补丁都是简单的更新并且传递property = value列表就足以解决特定问题这里提到的,没有明确需要完整的diff协议. (3认同)