我有一个具有sping-data-jpa
集成的应用程序。在我的存储库类中,我有一个方法:
@Transactional
@Modifying
@Query(value = "some insert query", nativeQuery = true)
void create(.....);
此方法将数据插入数据库。
从
POST
REST API内部调用此方法。当前,如果数据库中已经存在数据,则API返回错误响应。现在,此API的客户端希望多次对相同的数据执行相同的操作,并希望成功响应意味着我需要将此API设为幂等。
如何使这个API成为幂等?
从POST到PUT的方法更改是否可行,还是需要随方法更改一起添加更多更改?什么样的变化?
最佳答案
从POST到PUT的方法更改是否可行,还是需要随方法更改一起添加更多更改?
不,关于“幂等”的重要事情是请求处理程序做正确的事情。更改使用的方法不会发生任何魔术。
好消息是,从技术上讲,您的实现已经是幂等的(至少从说明中来说)。 RFC 7231中有一个定义,您应仔细阅读。重要的元素是,接收请求的两个副本会使资源处于与接收请求的一个副本相同的状态。
因此,您需要做的“所有”工作是弄清楚如何知道该错误是因为记录已经在数据库中了(并且不是出于其他某种原因),然后用看起来像下面的响应替换当前正在发送的错误成功消息。
正如其他答案所指出的那样,由于POST不承诺幂等语义,因此通用组件不会知道可以重试消息,因此,如果原始响应丢失,它将失败。只有发出请求的自定义客户端可能知道可以成功重试POST。
(将此与GET进行比较-您的浏览器知道GET请求是幂等的;浏览器不必询问人员是否可以安全地重试该请求,因为服务器已经承诺可以安全地处理该请求)。
在幂等消息交换上使用POST方法没有什么问题(尽管如果其他语义匹配,则某些其他方法可能是更好的选择)。