不应该PUT =创建和POST =更新
由于PUT是幂等的,所以不应该使用PUT来Create
和POST用于Update
。
那样,同一订单的多个PUT将只放置一个订单?
不同之处在于PUT用于已知资源,因此用于更新,如rfc2616中所述。
POST和PUT请求之间的根本区别反映在请求URI的不同含义中。 POST请求中的URI标识将处理封闭实体的资源。 该资源可能是数据接受过程,其他协议的入口或接受注释的独立实体。 相比之下,PUT请求中的URI标识请求附带的实体 - 用户代理知道URI的目标是什么,服务器不能尝试将请求应用于其他资源。
不过,我确实知道你是从哪里来的。
我通常会看POST,因为它应该是将处理我的请求内容的URI(在大多数情况下,参数是表单值),从而创建一个新的资源,并将PUT作为URI的对象(我的请求/用户/ 1234),一个已经存在的资源。
我相信这个术语可以回溯很久,考虑早期的网络。 有人可能会想POST
他们的消息,一个留言板,然后PUT
在以后的附加内容到他们的消息。
PUT应该用于创建当且仅当新资源的URI可能为客户端所知。 新的URI可能由资源表示中的服务广告。 例如,服务可以提供某种形式的提交表单并在其上指定动作URI,该动作URI可以是新资源的预填充URI。 在这种情况下,是的,如果初始PUT请求成功创建资源,那么PUT请求将仅替换它。
可以使用POST进行更新,但从来没有说POST只是用于“创建”操作。
HTTP方法和CRUD之间没有严格的对应关系。 这是一些框架采用的约定,但与REST约束无关。
PUT
请求会要求服务器用指定的表示替换给定的URI,完全忽略当前内容。 一个很好的比喻是shell中的mv
命令。 它在目标处创建新文件(如果它不存在),或者替换存在的任何文件。 无论哪种情况,它都完全忽略了那里的任何内容。 只要您发送完整的表示形式,您就可以使用它来创建,但也可以更新内容。
POST
要求目标资源根据预定义的规则处理有效负载,因此它是用于任何尚未由HTTP协议标准化的操作的方法。 这意味着POST
可以做任何你想做的事情,只要你不重复其他方法的功能 - 例如,当你应该使用GET
时使用POST
进行检索 - 并且正确记录它。
所以,你可以同时使用用于创建和更新,取决于具体的情况,但PUT
你必须有一致的语义为您的API中的一切,你不能让部分更新,并与POST
你可以做任何你想要的,如只要你记录它的工作原理。