0

我正在尝试编写银行应用程序传输 REST API。我已经使用 SpringMVC、JDBCTemplate 进行了开发。我正在发送一个带有 JSON 格式的有效负载(fromAccountID、toAccountID、amount)的 POST 请求。

如果用户错误地多次单击传输按钮(假设 UI 上未处理)并且相同的有效负载作为 JSON 发送到 API:

1.) 如何确保只处理第一个请求?

2.) 应该如何处理其余的重复请求?

3.)用户可能真的试图再次将相同的金额转移到相同的目标帐户,所以重复的应该只处理几分钟。如何做到这一点?

4.) 这个场景在实时银行应用程序中是如何处理的?

我正处于学习编写 REST API 的初始阶段,因此将不胜感激有关此用例的任何指导。

4

2 回答 2

0

根据我的理解,请在下面找到相同的评论;

在这种情况下,我们需要在接口本身应用检查。

如果请求来自按钮,则可以通过 onclick 事件和简单的确认对话框轻松处理

如果需要不要求用户确认并向 API 发送请求以处理付款,那么您可以将先前的请求存储在某处(数组或会话),如果匹配则要求用户确认。

这是您可以解决此问题的方法。

于 2018-10-12T18:46:40.027 回答
0

解决此问题的 RESTful 方法是确保您只使用幂等请求。幂等请求或多或少定义为:

执行一次请求后服务器上的状态将与执行 n 次相同的请求相同。

有一些 HTTP 请求被明确定义为幂等,例如:

  • 删除
  • 得到

因此,如果您可以PUT以用于创建新传输的方式设计您的应用程序,并且PUT正确实施,那么接收相同的请求 n 次应该没有副作用。

不过,这并不总是特别容易,因为如果您使用 '创建' 一个新的传输资源PUT,这意味着客户端必须确定传输的新 URI 将是什么。例如,客户端可以为 url 生成 UUID。

我认为这种方法是迄今为止最可取的。如果传输资源已经存在,您可以通过包含标头自动让服务器抛出错误If-None-Match: *。如果您使用此标头,您可以返回412 Precondition Failed资源已经存在。

我的猜测是你的直觉会被POST用来创建新的转移,但这个想法POST = create & PUT = update是不正确的。如果客户端可以知道路径,PUT应该用于创建和更新资源。

于 2018-10-12T19:22:32.453 回答