我很好地实现了REST服务(如果重要的话,在Windows CE平台上),我开始使用IBM's general definitions使用POST创建(INSERT)和PUT进行更新。
现在我遇到了Sun's definitions,这恰恰相反。所以我的问题是,“普遍接受的”定义是什么?或者甚至还有一个?
答案 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上的问题的接受答案。