2009-06-23 38 views
6

我正在开发一个REST API,我想知道以下几点:使用HTTP PUT,但不能完全代替实体

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

我在问,因为PUT会是一个非常方便的方法来做一些更新,但我不希望他们删除字段,如果他们碰巧拼错了其中的一些。此外,我不想强​​制实施者总是先做一个GET,然后复制他们实际上可能没有使用的每一个字段。

回答

2

放置仅用于完全替换。有一个建议动词PATCH来解决你所遇到的问题(http://www.ietf.org/internet-drafts/draft-dusseault-http-patch-14.txt

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

您可以将每个字段公开为资源并对每个字段进行多次放入。你可以通过pipeline来缓解额外的延迟。

+0

补丁是,就像你提到的,仍然是一个草稿..多PUTs将非常讨厌:) 我可以使用POST所有这些,而不是..虽然.. PUT将会更好.. – Evert 2009-06-23 15:54:14

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> 
+0

REST的想法可能是灵活的,但它确实说你使用的动词应该有统一的行为。 HTTP在PUT应该如何处理方面非常具体。共识是PUT应该取代实体,而不是做你的建议。 – 2009-06-23 16:05:50

+0

叶普我同意POST是最好的选择。尽管它灵活多变,但不应该违反基本思想/规则。 – Daff 2009-06-23 21:26:50

4

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

退房罗伊的文章It's ok to use POST

1

我从来不喜欢任何对部分更新的解决方案,无论是。如果我正在设计一个广泛使用的Web服务,我可能会使用POST。如果它只供相当少数人使用,即我可以与所有我期望称之为的人交谈,我已经有了两个不同的想法来解决它。

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

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

如果任何人有指向类似想法的讨论,请相应地编辑/评论。