我正在使用REST服务器。我有一个订单RESOURCE。
根据我的理解,PUT动词应根据URL创建新订单。我的问题是:如果资源是新的并且您不知道新订单的ID,那么它如何工作?
我知道有关POST与PUT的争论,但我引用了PUT {3}}的w3规范
“如果Request-URI未指向现有资源,并且该URI能够被请求用户代理定义为新资源,则源服务器可以使用该URI创建资源”
答案 0 :(得分:6)
在RESTful API中,PUT
通常用于更新资源,如果在指定的URL(即客户端)中不存在,则创建提供id)。如果服务器生成id,RESTful API通常使用POST
来创建新资源。在后一种情况下,通常在重定向中返回或指定生成的id / url。
示例:POST /orders/
答案 1 :(得分:2)
根据W3C,PUT
和POST
都可以用于更新和/或创建。
它们之间的基本区别是服务器如何处理 Request-URI 。 PUT
URI标识实体,服务器不应尝试将其映射到另一个URL,而POST
URI可以是该内容的处理程序。例子:
POST
/order
的新订单可以,但不是PUT
。您可以使用PUT
或POST
至/order/1
更新订单1。
答案 2 :(得分:1)
简单地说POST
用于创建,PUT
用于更新。如果您没有对象的ID,因为它尚未创建,您应该使用POST
。如果某个对象存在并且您只是没有该ID,那么您将不得不使用某种GET
来搜索它。
要记住的是Idempotence。 PUT
(和GET
就此而言)是幂等的。基本上意思是,你可以反复点击相同的URL,它不应该在第二次或第三次产生差异(它编辑一次数据,然后再次调用它不会再次进行更改)。但是POST
不幂等。意思是,你连续3到4次点击相同的URL,它将继续改变数据(创建越来越多的对象)。这就是为什么如果您点击返回POST
网址,浏览器会发出警告。
答案 3 :(得分:0)
您说,“不知道新订单的ID”因此以下情况并非如此“请求用户代理能够将URI定义为新资源”,因此PUT不适合您的方案
混淆在哪里?我当然假设Id将成为URL的一部分。