它们似乎都在将数据发送到体内的服务器,那么什么使它们与众不同呢?
HTTP PUT:
PUT将文件或资源放置在特定的URI上,并确切地放置在该URI上。如果该URI上已经有文件或资源,则PUT会替换该文件或资源。如果那里没有文件或资源,则PUT将创建一个文件或资源。PUT是幂等的,但自相矛盾的是PUT响应不可缓存。
HTTP POST:
POST将数据发送到特定的URI,并期望该URI上的资源可以处理请求。此时,Web服务器可以确定在指定资源的上下文中如何处理数据。POST方法不是幂等的,但是只要服务器设置适当的Cache-Control和Expires标头,POST响应就可以缓存。
官方HTTP RFC指定POST为:
POST和PUT之间的区别:
RFC本身解释了核心区别:
POST和PUT请求之间的根本区别体现在Request-URI的不同含义上。POST请求中的URI标识将处理封闭实体的资源。该资源可能是数据接受过程,通向其他协议的网关,或者是接受注释的单独实体。相比之下,PUT请求中的URI标识请求所包含的实体-用户代理知道要使用的URI,并且服务器绝不能尝试将请求应用于其他资源。如果服务器希望将该请求应用于其他URI,则它必须发送301(永久移动)响应;然后,用户代理可以自行决定是否重定向请求。
此外,更简洁一点的是RFC 7231第4.3.4节PUT状态(添加了强调),
4.3.4。放
PUT方法请求目标资源的状态为请求消息有效载荷中包含的表示形式
created
或replaced
具有该状态。
使用正确的方法,除无关紧要的以外:
REST ROA与SOAP的一个好处是,当使用HTTP REST ROA时,它鼓励正确使用HTTP动词/方法。因此,例如,仅当你想在该确切位置创建资源时才使用PUT。而且,你永远不会使用GET创建或修改资源。
我在规格书中读到了
If the Request-URI does not point to an existing resource [...] the origin server *can* create the resource with that URI
。因此,如果不存在则拒绝创建资源的PUT实现是正确的,对吗?如果是这样,实际上会发生这种情况吗?还是实现通常也可以在PUT上创建?在下一个URL上有一些使异常非常明显的其他异常-dzone.com/articles/put-vs-post
我不了解的是如何实现PUT的幂等性。通常,在创建新资源的情况下,大多数API都会使用ID的自动生成。并在PUT中,如果资源不存在,则应创建一个资源,但要使用URI中指定的ID,但是如果将id生成方法设置为自动的,该怎么办?
简而言之:POST请求中的URI标识将处理封闭实体的资源。PUT请求中的URI标识实体本身。
对POST方法的响应不可缓存,除非响应包含适当的Cache-Control或Expires标头字段