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