40

由于PUT 是幂等的,因此不应该使用PUTCreatePOST 。Update

这样同一个订单的多个 PUT 只会下一个订单?

4

5 回答 5

70

不同之处在于 PUT 用于已知资源,因此用于更新,rfc2616 中所述。

POST 和 PUT 请求的根本区别体现在 Request-URI 的不同含义上。POST 请求中的 URI 标识将处理封闭实体的资源。该资源可能是一个数据接受进程,一个通往其他协议的网关,或者一个接受注释的单独实体。相比之下,PUT 请求中的 URI 标识了请求中包含的实体——用户代理知道 URI 的意图,服务器不得尝试将请求应用于其他资源。

但是,我确实根据名称本身知道您来自哪里。

我通常看 POST 因为它应该是处理我的请求内容的 URI(在大多数情况下,params 作为表单值)并因此创建一个新资源,而 PUT 作为我的请求主题的 URI(/ users/1234),一个已经存在的资源。

我相信命名法可以追溯到很长一段时间,考虑早期的网络。有人可能希望将POST他们的消息发送到留言板,然后PUT在以后将其他内容添加到他们的消息中。

于 2012-06-04T17:07:06.487 回答
13

HTTP 方法和 CRUD 之间没有严格的对应关系。这是一些框架采用的约定,但与 REST 约束无关。

请求要求服务器用封闭的PUT表示替换给定 URI 中的任何内容,完全忽略当前内容。一个很好的类比是mvshell 中的命令。如果它不存在,它会在目的地创建新文件,或者替换任何存在的文件。无论哪种情况,它都会完全忽略其中的任何内容。只要您发送完整的表示,您就可以使用它来创建,也可以更新某些内容。

POST要求目标资源根据预定义的规则处理有效负载,因此它是用于尚未被 HTTP 协议标准化的任何操作的方法。这意味着 aPOST可以做任何你想做的事情,只要你不复制其他方法的功能——例如,POST在你应该使用的时候用于检索GET——并且你正确地记录它。

因此,您可以根据具体情况同时使用创建和更新,但是PUT您必须对 API 中的所有内容具有一致的语义,并且您不能进行部分更新,并且POST您可以做任何您想做的事情,只要你记录它是如何工作的。

于 2015-04-22T16:21:36.840 回答
7

当且仅当客户端知道新资源的可能 URI 时,才应使用 PUT 进行创建。新的 URI 可能由服务以资源表示形式通告。例如,服务可能会提供某种提交表单并在其上指定操作 URI,该操作 URI 可以是新资源的预填充 URI。在这种情况下是的,如果初始 PUT 请求成功创建 PUT 请求后的资源,则只会替换它。

可以使用 POST 进行更新,从未说过 POST 仅用于“创建”操作。

于 2012-06-04T17:08:01.867 回答
3

您正在尝试将 CRUD 与 HTTP 相关联,但这是行不通的。HTTP 的哲学是不同的,并且本身并不对应于 CRUD。由于 REST 引起了混乱;这确实对应于CRUD。REST 使用 HTTP,但对允许的内容有额外的限制。我准备了这个问答来解释 HTTP 的处理方法:

要求什么?

  • APOST请求对集合执行操作
  • APUT请求将资源放置到集合中。

URI 中命名了什么样的对象?

  • a 的 URIPOST标识一个集合
  • a 的 URIPUT 标识资源(在集合中)。

URI 中的对象是如何分别指定POSTPUT

/collectionId
/collectionId/resourceId

HTTP 协议赋予集合多少自由度?

  • 使用 a POST集合处于控制之中。
  • 使用 a PUT请求者处于控制之中(除非请求失败)。

HTTP 协议有什么保证?

  • 对于 a POST,HTTP 协议没有定义集合应该发生什么;rfc 声明服务器应该“根据 [collection's] 自己的特定语义处理……请求。 ”(仅供参考:rfc 使用令人困惑的短语“target resource”来表示“collection”。)这取决于服务器来决定定义 a将做什么的合同。POST
  • 对于 a PUT,HTTP 协议要求“成功”响应必须保证集合现在包含具有请求指定的 ID 和内容的资源。

该操作能否导致在集合中创建新资源?

  • 或否,取决于合同。如果合约是 REST 协议,则需要插入。当 aPOST创建新资源时,响应将为 201。
  • 的,但这意味着请求者正在指定新 ID。这对公告板很好,但对数据库有问题。(因此,对于数据库应用程序,PUT一般不会插入,而只会更新。)当 aPUT 创建新资源时,响应将是 201。

操作是幂等的吗?

  • APOST通常不是幂等的。(服务器可以提供它希望的任何合约,但幂等性通常不是该合约的一部分)。
  • A必须PUT是幂等的。(已识别资源的状态是幂等的。允许该资源之外的副作用。)

这是 rfc: https ://www.rfc-editor.org/rfc/rfc7231#section-4.3.3

于 2020-04-16T01:41:49.740 回答
0

这取决于..您可以同时创建/更新站点/记录。当客户端指定 URI 时,PUT 就是要走的路。例如,像 Dreamweaver 这样的任何代码编辑器,PUT 都是正确的协议。

也看看这个线程:put vs post in rest

于 2012-06-04T17:18:35.607 回答