我正在开发一个REST api,我想知道以下内容:
我想使用HTTP PUT更新webservice中的某些实体。格式将是一个urlencoded主体。是否可以仅更新实际指定的字段,而不是整个实体?
我问,因为PUT是一种非常方便的方法来进行一些更新,但我不希望它们删除字段,如果它们恰好拼错其中一些。另外,我不想强制实现者总是首先进行GET并复制他们可能实际上不使用的每个字段。
答案 0 :(得分:4)
您只需将更新的属性POST到资源即可。请记住,POST是一个包罗万象的动词,当其他动词不适合你时,你可以用它来做你需要做的任何事情。
查看Roy的文章It's ok to use POST
答案 1 :(得分:2)
Put仅用于完全替换。动词PATCH有一个建议来解决你遇到的问题(http://www.ietf.org/internet-drafts/draft-dusseault-http-patch-14.txt)
然而,补丁仍然可能不是你想要的。发送的是一个可以执行增量计数器之类的更新资源,因此,与put不同,它不是幂等的。您可以将每个字段公开为资源,并对每个字段执行多次放置。你可以pipeline看跌期权来减轻额外的延迟。
答案 2 :(得分:1)
我想说这可能有意义。我认为REST的想法非常灵活,因此如果您更新一个实体,为什么不仅要传输需要在实现中更新的字段。确实,它需要更多的服务器支持。您必须检查实体是否可用,并且可以使用传输的数据进行更新,并且您需要进行验证检查(而不是无架构的面向文档的数据)。
<!-- PUT books/1337 -->
<book>
<title>Hello</title>
<author>John Doe</author>
</book>
<!-- PUT books/1337 -->
<book>
<title>Hello here I am</title>
</book>
答案 3 :(得分:1)
我也从不喜欢任何部分更新的解决方案。如果我正在设计一个广泛使用的Web服务,我可能会选择POST
。如果它是供相当少数人使用的,也就是说,我可以与我期望称之为的所有人交谈,我有两个不同的想法来解决它。
PUT
到新的“更新”资源。它基本上会记录您要应用的更新,然后负责不应用重复项。我设想这个工作有点像一个版本控制系统,它保存一个补丁/变更集列表,并且每当我试图考虑所有角落情况时都会变得非常复杂。
PUT
到资源,但不要更改任何不存在的字段。要求您希望NULL
出现的字段带有一个特殊属性,表明您希望NULL
出来。这似乎更实际,但不能很好地符合PUT
应该是完整更新的共识。
如果有人指出有关类似想法的讨论,请相应地编辑/评论。