由于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 中的任何内容,完全忽略当前内容。一个很好的类比是mvshell 中的命令。如果它不存在,它会在目的地创建新文件,或者替换任何存在的文件。无论哪种情况,它都会完全忽略其中的任何内容。只要您发送完整的表示,您就可以使用它来创建,也可以更新某些内容。
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将做什么的合同。POSTPUT,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