PUT的功能与REST API中的POST有何不同

时间:2019-04-25 20:03:00

标签: rest api http post put

我已经阅读了许多有关PUT和POST之间差异的答案。 提供的答案是PUT在几乎所有答案中都是幂等的。

使用Put时,将提供一个ID,并提供完整的实体,

我的疑问是,如果我们将带有ID的post方法与实体一起用作输入,这会有什么区别?在任何一种情况下,都必须执行数据库查询以检查数据是否存在。

那为什么要用两种不同的方法呢?两者的运作方式是否有区别? PUT在技术上通过POST提供了哪些额外的功能或特性,而不仅仅是语言上的差异。

2 个答案:

答案 0 :(得分:0)

  

POST和PUT方法之间的根本区别是      以不同的意图突出显示。      POST请求中的目标资源旨在处理      根据资源自身的语义进行封闭表示,      而PUT请求中包含的表示形式定义为      替换目标资源的状态。因此,PUT的意图      是中介的,是幂等的,并且对中介可见      效果仅由原始服务器知道。

https://tools.ietf.org/html/rfc7231#section-4.3.4

  

如果请求方法具有预期效果,则认为该方法是“幂等的”      使用该方法的多个相同请求的服务器是      与单个此类请求的效果相同。的请求方法      由本规范,PUT,DELETE和安全请求方法定义      是幂等的。

     

就像保险柜的定义一样,幂等属性仅适用于      用户的要求;服务器可以自由登录      单独请求,保留修订控制历史记录或实施      每个幂等请求的其他非幂等副作用。

     

全能方法之所以能够被区分,是因为请求可以      如果在通信之前发生通信故障,则自动重复      客户端能够读取服务器的响应。例如,如果      客户端发送一个PUT请求,基础连接关闭      在收到任何响应之前,客户端可以建立一个新的      连接,然后重试幂等请求。它知道重复      该请求将具有相同的预期效果,即使原始请求      请求成功,尽管响应可能有所不同。

https://tools.ietf.org/html/rfc7231#section-4.2.2

答案 1 :(得分:0)

  

那为什么要用两种不同的方法呢?两者的运作方式是否有区别?

不一定。但是它们的含义(语义学)存在巨大差异。

Idempotent是重要的语义差异;在不可靠的网络上,邮件会丢失。此外,无法确定丢失的消息是请求还是响应。

幂等语义允许我们做的是安排客户端在等待响应超时时重新发送请求。

此外,由于幂等诺言是HTTP标准本身的一部分,因此通用组件可以安全地自行决定重新发送请求,而无需了解有关请求的特定领域上下文的任何信息。

PUT本身也具有一些有趣的含义:

  

除非成功保存请求的表示数据而未对主体进行任何转换(例如,保存请求的表示数据),否则原始服务器不得在成功响应PUT时发送验证程序头字段(第7.2节),例如ETag或Last-Modified字段。 ,则资源的新表示形式数据与在PUT请求中接收到的表示形式数据相同),并且验证器字段值反映了新表示形式。此要求允许用户代理知道它在内存中的表示实体何时由于PUT而保持最新状态,因此不需要再次从源服务器检索,并且响应中接收到新的验证器。可以用于将来的条件请求,以防止意外覆盖(第5.2节)。

在服务器实现中,可以使用与PUT完全相同的逻辑来实现POST;但是如果没有该方法所承诺的语义,那么通用客户端就无法利用。