REST API的幂等性

时间:2019-01-31 19:50:43

标签: java rest spring-data-jpa

我有一个集成了sping-data-jpa的应用程序。在我的存储库类中,我有一个方法:

@Transactional
@Modifying
@Query(value = "some insert query", nativeQuery = true)
void create(.....);

此方法正在将数据插入数据库。

POST REST API内部调用此方法。当前,如果数据库中已经存在数据,则API返回错误响应。 现在,此API的客户端希望多次对相同的数据执行相同的操作,并希望成功响应意味着我需要将此API设为幂等。 如何使该API成为幂等? 从POST更改为PUT的方法是否可行,还是需要随着方法更改添加更多更改?什么样的变化?

3 个答案:

答案 0 :(得分:1)

  

从POST更改为PUT的方法是否可行,还是需要随方法的更改添加更多更改?

不,关于“幂等”的重要事情是请求处理程序执行正确的操作。更改您使用的方法不会发生任何魔术。

好消息是,从技术上讲,您的实现已经是幂等的(至少从说明中而言)。 RFC 7231中有一个您应查看的定义。重要的要素是,接收到请求的两个副本会使资源处于与接收请求的一个副本相同的状态。

因此,您需要做的“全部”是弄清楚如何知道错误是因为记录已经在数据库中了(而不是由于其他原因),然后用响应替换当前正在发送的错误看起来像成功消息。

正如其他答案所指出的那样,由于POST不承诺幂等语义,因此通用组件不会知道可以重试消息,因此,如果原始响应丢失,它将失败。 。唯一可能是发出请求的自定义客户端可能知道可以成功重试POST。

(将此与GET进行比较-您的浏览器知道GET请求是幂等的;浏览器不必询问人员是否可以安全地重试该请求,因为服务器已经承诺可以安全地处理该请求)。

在幂等消息交换中使用POST方法没有什么问题(尽管如果其他语义匹配,则某些其他方法可能是更好的选择)。

答案 1 :(得分:0)

根据定义,POST不是幂等方法,因此在已经创建资源后返回成功就没有意义。

您可以做的是将POST逻辑移至PUT方法,并实现与通常称为“创建或更新”的类似操作。所以是PUT幂等,这似乎合乎逻辑的选择在这里为您的创建和更新。

以下是幂等方法的一些附加信息:

答案 2 :(得分:-1)

POST has no notion of idempotency

  

的方法还可以具有在该“幂等性”的性质(除了
  从错误或到期的问题)N的副作用> 0相同
  请求与单个请求相同。该方法GET,HEAD,
  PUT和DELETE共享此属性。另外,方法OPTIONS和
  TRACE不应有副作用,所以是固有幂等的。

所以从根本上讲,您有两个不同的动词-初始创建时使用POST,更新时使用PUT。这将是一个更简洁的方法反正考虑到将来的维护人员将肯定知道是不是你的预期POST方法来维持状态,并且将基本上被保留用于创建和PUT方法将被保留用于更新和维护的现有状态。