由于PUT 是幂等的,因此不应该使用PUTCreate
和POST 。Update
这样同一个订单的多个 PUT 只会下一个订单?
不同之处在于 PUT 用于已知资源,因此用于更新,如rfc2616 中所述。
POST 和 PUT 请求的根本区别体现在 Request-URI 的不同含义上。POST 请求中的 URI 标识将处理封闭实体的资源。该资源可能是一个数据接受进程,一个通往其他协议的网关,或者一个接受注释的单独实体。相比之下,PUT 请求中的 URI 标识了请求中包含的实体——用户代理知道 URI 的意图,服务器不得尝试将请求应用于其他资源。
但是,我确实根据名称本身知道您来自哪里。
我通常看 POST 因为它应该是处理我的请求内容的 URI(在大多数情况下,params 作为表单值)并因此创建一个新资源,而 PUT 作为我的请求主题的 URI(/ users/1234),一个已经存在的资源。
我相信命名法可以追溯到很长一段时间,考虑早期的网络。有人可能希望将POST
他们的消息发送到留言板,然后PUT
在以后将其他内容添加到他们的消息中。
HTTP 方法和 CRUD 之间没有严格的对应关系。这是一些框架采用的约定,但与 REST 约束无关。
请求要求服务器用封闭的PUT
表示替换给定 URI 中的任何内容,完全忽略当前内容。一个很好的类比是mv
shell 中的命令。如果它不存在,它会在目的地创建新文件,或者替换任何存在的文件。无论哪种情况,它都会完全忽略其中的任何内容。只要您发送完整的表示,您就可以使用它来创建,也可以更新某些内容。
POST
要求目标资源根据预定义的规则处理有效负载,因此它是用于尚未被 HTTP 协议标准化的任何操作的方法。这意味着 aPOST
可以做任何你想做的事情,只要你不复制其他方法的功能——例如,POST
在你应该使用的时候用于检索GET
——并且你正确地记录它。
因此,您可以根据具体情况同时使用创建和更新,但是PUT
您必须对 API 中的所有内容具有一致的语义,并且您不能进行部分更新,并且POST
您可以做任何您想做的事情,只要你记录它是如何工作的。
当且仅当客户端知道新资源的可能 URI 时,才应使用 PUT 进行创建。新的 URI 可能由服务以资源表示形式通告。例如,服务可能会提供某种提交表单并在其上指定操作 URI,该操作 URI 可以是新资源的预填充 URI。在这种情况下是的,如果初始 PUT 请求成功创建 PUT 请求后的资源,则只会替换它。
可以使用 POST 进行更新,从未说过 POST 仅用于“创建”操作。
您正在尝试将 CRUD 与 HTTP 相关联,但这是行不通的。HTTP 的哲学是不同的,并且本身并不对应于 CRUD。由于 REST 引起了混乱;这确实对应于CRUD。REST 使用 HTTP,但对允许的内容有额外的限制。我准备了这个问答来解释 HTTP 的处理方法:
要求什么?
POST
请求对集合执行操作。PUT
请求将资源放置到集合中。URI 中命名了什么样的对象?
POST
标识一个集合。PUT
标识资源(在集合中)。URI 中的对象是如何分别指定POST
的PUT
?
/collectionId
/collectionId/resourceId
HTTP 协议赋予集合多少自由度?
POST
,集合处于控制之中。PUT
,请求者处于控制之中(除非请求失败)。HTTP 协议有什么保证?
POST
,HTTP 协议没有定义集合应该发生什么;rfc 声明服务器应该“根据 [collection's] 自己的特定语义处理……请求。 ”(仅供参考:rfc 使用令人困惑的短语“target resource”来表示“collection”。)这取决于服务器来决定定义 a将做什么的合同。POST
PUT
,HTTP 协议要求“成功”响应必须保证集合现在包含具有请求指定的 ID 和内容的资源。该操作能否导致在集合中创建新资源?
POST
创建新资源时,响应将为 201。PUT
一般不会插入,而只会更新。)当 aPUT
创建新资源时,响应将是 201。操作是幂等的吗?
POST
通常不是幂等的。(服务器可以提供它希望的任何合约,但幂等性通常不是该合约的一部分)。PUT
是幂等的。(已识别资源的状态是幂等的。允许该资源之外的副作用。)这是 rfc: https ://www.rfc-editor.org/rfc/rfc7231#section-4.3.3
这取决于..您可以同时创建/更新站点/记录。当客户端指定 URI 时,PUT 就是要走的路。例如,像 Dreamweaver 这样的任何代码编辑器,PUT 都是正确的协议。
也看看这个线程:put vs post in rest