在RESTFUL SOA中,假设我通过Ajax发布了邮政请求,但是在请求时间之前,我没有得到响应。进一步假设重新提出请求是有害的。帖子不是掌握的。例如,也许我要发布银行汇款。如果我没有得到响应,我不知道服务器是否处理了请求。
假设我对客户端和服务方面有控制权?
的最佳实践是什么?我最初的想法是在每个帖子请求中包括一个nonce(即伪ID;某种唯一标识符);例如也许是IF-NONE匹配标题中的值。使用这种方法,客户端可以通过编程方式重新评估具有相同伪ID的时机请求,并且服务器可以拒绝它,如果它包含重复值。
我听说过多种方法可以尝试解决这个
-
获取当前状态。
设计服务,以便如果帖子失败,客户可以在相同的资源上签发a get a get a get a get a get of返回的数据,他们可以确定帖子是否成功。
这种方法的问题是在帖子在集合中创建新项目的情况下,客户可能很难确定帖子是否成功(即,我的帖子是否添加了该项目或某人其他?)
-
if-Match
使用
If-Match
标头防止帖子重复。例如,如果帖子将项目添加到集合中,并且该集合当前具有ETag
的CC_2。如果在帖子上使用737060cd8c284d8af7ad3082f209582d
的If-Match
,则仅当集合的ETag
仍然是737060cd8c284d8af7ad3082f209582d
时,该帖子才能成功,这将添加该项目并导致该集合的新ETag
。在此阶段重复帖子只会返回412 Precondition Failed
。这种方法的问题是当您获得
412 Precondition Failed
时,您无法确定您的帖子是否修改了集合或其他人的。 -
发帖然后放置
设计您的服务以永不持久帖子中的数据。相反,该帖子以邮政内容创建了一个临时资源,该资源处于"待处理"状态。然后,该临时资源将"承诺"。通过这种方法,您不在乎您的帖子时间是否已经发布,只需再次请求帖子,这一次您希望获得您的临时资源。如果提交资源时间的投入,您也不在乎,因为看台是愿意的。
这种方法的唯一真正缺点是管理临时资源和客户所需的额外工作所需的额外工作。
更新
-
nonce
在请求中使用nonce(又称消息ID,事务ID,请求ID,相关ID)是解决此问题的常见方法;但是,它可能存在可扩展性问题。如果您承诺拒绝使用以前的Nonce的所有帖子,则需要扫描现有的帖子记录以确定以前是否使用过NonCE。当您只有几千个帖子时,这不是问题,但是当您拥有数百万美元时,这可能会变得有问题(尤其是如果您没有以快速查询的方式存储Nonces)。
您可以通过减少对拒绝在特定时间范围内使用以前的nonce的所有帖子的承诺来减轻这种情况(例如,最后24小时),但是如果第一个帖子限制了,并且客户端在该时间段内断开了连接,那么它们是回到同一旧位置,他们不知道第一篇文章是否成功并且无法确定是否应该重新发布。