REST动词 - 哪个约定是“正确的”

时间:2010-03-15 14:06:16

标签: asp.net web-services rest

我很好地实现了REST服务(如果重要的话,在Windows CE平台上),我开始使用IBM's general definitions使用POST创建(INSERT)和PUT进行更新。

现在我遇到了Sun's definitions,这恰恰相反。所以我的问题是,“普遍接受的”定义是什么?或者甚至还有一个?

7 个答案:

答案 0 :(得分:20)

使用PUT创建资源的缺点是客户端必须提供 表示正在创建的对象的唯一ID。虽然它通常可以为客户 为了生成这个唯一的ID,大多数应用程序设计者更喜欢他们的服 通过他们的数据库)创建此ID。在大多数情况下我们想要 我们的服务器来控制资源ID的生成。那么我们该怎么办?我们可以转换 使用POST而不是PUT。

所以: Put = UPDATE

发布= INSERT

答案 1 :(得分:16)

使用POST作为INSERT和PUT作为UPDATE的原因是POST是根据HTTP的唯一nonidempotent和不安全的操作。幂等意味着无论您应用多少次操作,结果总是相同的。在SQL中,INSERT是唯一的非幂等操作,因此它应该映射到POST。 UPDATE是幂等的,因此它可以映射到PUT上。这意味着同一个PUT / UPDATE操作可能会被应用多次,但只会首先改变我们系统/数据库的状态。

因此,使用PUT进行INSERT将破坏HTTP语义的要求,即PUT操作必须是幂等的。

答案 2 :(得分:6)

动词是:

GET {path}检索标识为{path}的资源。

PUT {path}创建或更新标识为{path}的资源。

DELETE {path}删除标识为{path}的资源。

POST {path}调用{path}标识的操作。

当打算创建新资源时,如果我们知道资源的标识符应该是什么,我们可以使用PUT,如果我们希望服务器确定资源,我们可以使用POST新资源的标识符。

答案 3 :(得分:5)

当服务器通过其URI空间的一部分授予客户端控制权时,可以使用PUT进行创建。这相当于文件系统中的文件创建:当您保存到尚不存在的文件时,您创建它,如果该文件存在,则结果是更新。

但是,PUT缺乏客户端隐含意图的能力。考虑下订单:如果您输入/ orders / my-new-order,则意义只能更新/ orders / my-new-order标识的资源,而POST / orders /可能意味着'下新订单'如果POST接受资源具有适当的语义。

IOW,如果你想实现任何创建新资源的副作用,你必须使用POST。

答案 4 :(得分:2)

我们使用POST = Create,PUT = Update。

为什么呢?没有良好的原因。我们必须选择一个,这就是我做出的选择。

修改即可。看看其他答案,我意识到关键创建问题可能会做出决定。

我们POST新条目并返回带有生成密钥的JSON对象。看起来这更适合普遍接受的POST语义。

我们将具有标识对象的完整URI的现有条目PUT。

答案 5 :(得分:2)

这里http://www.w3.org/Protocols/rfc2616/rfc2616.html是如何实现HTTP方法行为的官方指南。

答案 6 :(得分:1)

我最近一直在研究REST的概念和实现,而且普遍的共识似乎是:PUT用于创建/更新,具体取决于资源是否已经存在。 POST用于将资源附加到集合。

请参阅HTTP / 1.1方法定义http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

  

POST旨在允许统一的方法来涵盖以下内容   功能:

  - Annotation of existing resources;

  - Posting a message to a bulletin board, newsgroup, mailing
    list, or similar group of articles;

  - Providing a block of data, such as the result of submitting a
    form, to a data-handling process;

  - Extending a database through an append operation.
     

PUT方法请求将所包含的实体存储在   提供了Request-URI。如果Request-URI引用已存在的URI   资源,封闭的实体应该被视为修改过的   驻留在原始服务器上的版本。

另请参阅Understanding REST: Verbs, error codes, and authentication上的问题的接受答案。