6

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

我想使用 HTTP PUT 来更新 web 服务中的一些实体。格式将是一个 urlencoded 正文。只更新实际指定的字段而不是整个实体是否可以接受?

我在问,因为 PUT 将是一种非常方便的方法来进行一些更新,但如果他们碰巧拼错了一些字段,我不希望他们删除字段。此外,我不想强​​迫实现者总是必须先做一个 GET 并复制他们可能实际不使用的每个字段。

4

4 回答 4

4

您可以简单地将更新的属性发布到资源。请记住,POST 是一个包罗万象的动词,当其他动词不适合您时,您可以使用它来做任何您需要做的事情。

查看 Roy 的文章可以使用 POST

于 2009-06-23T16:14:11.150 回答
2

Put仅用于完全替换。有一个动词 PATCH 可以解决您遇到的问题(http://www.ietf.org/internet-drafts/draft-dusseault-http-patch-14.txt

但是,补丁可能仍然不是您想要的。发送的是一个更新资源,可以执行增量计数器等操作,因此与 put 不同,它不是幂等的。

您可以将每个字段公开为资源并对每个字段执行多次放置。您可以将 put流水线化以减轻额外的延迟。

于 2009-06-23T15:26:30.233 回答
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>
于 2009-06-23T15:24:12.267 回答
1

我也不喜欢任何部分更新的解决方案。如果我正在设计一个广泛使用的 Web 服务,我可能会选择POST. 如果它是为少数人使用的,也就是说,我可以和所有我期望称之为它的人交谈,我有两种不同的想法来解决它。

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

  2. PUT到资源,但不要更改任何不存在的字段。要求您想要NULL输出的字段带有一个特殊属性,表明您想要NULL输出它。PUT这似乎更加实用,但与应该是完整更新的共识不太吻合。

如果有人对类似想法的讨论有意见,请相应地进行编辑/评论。

于 2009-06-24T12:37:08.103 回答