代码之家  ›  专栏  ›  技术社区  ›  ctacke

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

  •  20
  • ctacke  · 技术社区  · 7 年前

    我很喜欢实现rest服务(如果重要的话,可以在windows ce平台上实现),我开始使用 IBM's general definitions 使用post创建(插入)和put进行更新。

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

    7 回复  |  直到 15 年前
        1
  •  20
  •   Cristian Boariu    16 年前

    使用put创建资源的缺点是客户端必须提供 表示正在创建的对象的唯一ID。而对客户来说 为了生成这个唯一的id,大多数应用程序设计人员希望他们的服务器(通常 通过他们的数据库)创建这个id。 我们的服务器控制资源ID的生成。那我们该怎么办?我们可以交换 使用post而不是put。

    所以: 放置=更新

    post=插入

        2
  •  16
  •   Dove    16 年前

    使用post作为insert和put作为update的原因是post是 nonidempotent 以及根据http的不安全操作。等幂意味着不管你应用这个操作多少次,结果总是一样的。在sql中,insert是唯一的非等幂操作,因此它应该映射到post上。更新是等幂的,所以它可以在放置时映射。这意味着同一个put/update操作可能会应用多次,但只有在第一次应用时才会更改系统/数据库的状态。

    因此,使用put for insert将打破http语义的要求,即put操作必须是等幂的。

        3
  •  6
  •   yfeldblum    16 年前

    动词是:

    GET {path} : 检索 标识符为的资源 {path} .

    PUT {path} : 创建或更新 标识符为的资源 {路径} .

    DELETE {path} : 删除 标识符为的资源 {路径} .

    POST {path} : 援引 {路径} .

    当我们想要创造一个新的资源时,我们可以使用 PUT 如果我们知道资源的标识符应该是什么,并且我们可以使用 POST 如果我们希望服务器确定新资源的标识符。

        4
  •  5
  •   Jan Algermissen    16 年前

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

    然而,看跌期权缺乏客户隐含意图的能力。考虑下订单:如果您下的是/orders/my new order,意思只能是更新/orders/my new order标识的资源,而post/orders/可以是“下一个新订单”,如果post-accepting资源具有适当的语义。

    听着,如果你想在创建新资源的过程中获得任何副作用,你必须使用post。

        5
  •  2
  •   S.Lott    16 年前

    我们使用post=create,put=update。

    为什么?没有 好的 原因。我们得选一个,这就是我的选择。

    编辑 . 看看其他的答案,我意识到关键的创作问题可能会做出决定。

    我们发布新的条目并返回一个带有生成的键的json对象。这似乎更适合于普遍接受的post语义。

    我们使用标识对象的完整uri放入现有条目。

        6
  •  2
  •   Darrel Miller    16 年前

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

        7
  •  1
  •   Herbert    9 年前

    我最近一直在研究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方法要求将封闭的实体存储在 提供的请求uri。如果请求uri引用已经存在的 资源,封闭的实体应被视为修改的 位于源服务器上的版本。

    也可参见 Understanding REST: Verbs, error codes, and authentication .

    推荐文章