使用HTTP PUT,但不完全替换实体

时间:2009-06-23 15:21:27

标签: web-services http rest put

我正在开发一个REST api,我想知道以下内容:

我想使用HTTP PUT更新webservice中的某些实体。格式将是一个urlencoded主体。是否可以仅更新实际指定的字段,而不是整个实体?

我问,因为PUT是一种非常方便的方法来进行一些更新,但我不希望它们删除字段,如果它们恰好拼错其中一些。另外,我不想强​​制实现者总是首先进行GET并复制他们可能实际上不使用的每个字段。

4 个答案:

答案 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。如果它是供相当少数人使用的,也就是说,我可以与我期望称之为的所有人交谈,我有两个不同的想法来解决它。

  1. PUT到新的“更新”资源。它基本上会记录您要应用的更新,然后负责不应用重复项。我设想这个工作有点像一个版本控制系统,它保存一个补丁/变更集列表,并且每当我试图考虑所有角落情况时都会变得非常复杂。

  2. PUT到资源,但不要更改任何不存在的字段。要求您希望NULL出现的字段带有一个特殊属性,表明您希望NULL出来。这似乎更实际,但不能很好地符合PUT应该是完整更新的共识。

  3. 如果有人指出有关类似想法的讨论,请相应地编辑/评论。