【发布时间】:2012-10-30 06:17:09
【问题描述】:
在 RESTful SOA 中,假设我通过 AJAX 发出 POST 请求,但在请求超时之前我没有得到响应。进一步假设重新提交请求将是有害的。 POST 不是幂等的。例如,也许我正在发布银行转账。如果我没有得到响应,我不知道服务器是否处理了请求。
假设我可以控制客户端和服务端,那么处理这个问题的最佳做法是什么?
我最初的想法是在每个 POST 请求中包含一个随机数(即伪 ID;某种唯一标识符);例如可能是 If-None-Match 标头中的一个值。使用这种方法,客户端可以以编程方式重新发出具有相同伪 id 的超时请求,如果它包含重复值,服务器可以拒绝它。
【问题讨论】:
-
如果您在某个超时后没有得到响应,则假设它失败并要求客户端重试或中止。显然,服务器上的代码无论如何都应该检查相同的 id。
-
需要明确的是,这个伪 id 并不意味着是 the 资源 id——我不是直接寻址资源。我按预期使用 POST;即,发布到资源处理程序(例如 /Transfers,而不是 /Transfers/
)。否则,我一开始就不会做 POST。 -
这是一个与“Avoid duplicate POSTs with REST”类似的问题。
标签: rest timeout http-post soa