首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理超时的POST请求

如何处理超时的POST请求
EN

Stack Overflow用户
提问于 2012-11-10 05:34:10
回答 1查看 7.2K关注 0票数 14

在AJAX SOA中,假设我通过RESTful发出一个POST请求,但是在请求超时之前没有得到响应。此外,假设重新提交请求将是有害的。POST不是幂等的。例如,也许我正在张贴一笔银行转账。如果我没有得到响应,我不知道服务器是否处理了请求。

假设我可以控制客户端和服务端,那么处理这个问题的最佳实践是什么?

我最初的想法是在每个POST请求中包含一个现时值(即伪id;某种唯一标识符);例如,在If-None Match头部中可能包含一个值。使用这种方法,客户端可以通过编程方式重新发出具有相同伪id的超时请求,并且如果请求包含重复值,则服务器可以拒绝该请求。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-12 19:54:47

我听说有很多方法可以解决这个问题

  1. 获取当前状态。

设计服务,以便如果POST失败,客户端可以在相同的资源上发出GET,并根据返回的数据确定POST是否成功。

这种方法的问题是,在帖子在集合中创建新项目的情况下,客户端可能很难确定帖子是否成功(即,我的帖子是否添加了该项目,或者是否有人else's?)

  • If-Match

使用If-Match标头来防止POST重复。例如,如果帖子正在向集合添加项目,并且该集合当前具有737060cd8c284d8af7ad3082f209582dETag。如果在POST中使用了737060cd8c284d8af7ad3082f209582dIf-Match,那么只有当集合的ETag仍然为737060cd8c284d8af7ad3082f209582d时,POST才会成功,这将添加该项并为集合生成一个新的ETag。在这个阶段重复POST只会返回412 Precondition Failed

这种方法的问题是,当你得到一个412 Precondition Failed时,你不能确定你的帖子是修改了集合还是别人的集合。

将您的服务设计为永远不会持久化来自POST的数据。相反,POST创建了一个带有POST内容的临时资源,该资源处于“挂起”状态。然后使用PUT“提交”此临时资源。使用这种方法,你并不关心你的帖子是否超时,只需再次请求帖子,这一次你就有希望获得临时资源。如果提交资源的PUT超时,你也不会在意,因为PUT是幂等的。

这种方法唯一真正的缺点是管理临时资源所需的额外工作和客户端所需的额外工作。

Update

  • Nonce

在请求中使用现时值(也称为消息ID、事务ID、请求ID、相关ID)是解决此问题的常用方法;但是,它可能存在可伸缩性问题。如果您承诺拒绝所有使用先前nonce的帖子,则需要扫描现有的帖子记录,以确定该nonce以前是否被使用过。当你只有几千篇帖子时,这不是问题,但当你有数百万篇帖子时,这可能会成为问题(特别是如果你没有以一种快速查询的方式存储随机数)。

你可以通过减少在一定的时间范围内(例如,最近24小时)拒绝所有使用先前随机数的帖子的承诺来缓解这种情况,但是如果第一个帖子超时,客户端在该时间范围内断开连接,那么它们就会回到原来的位置,他们不知道第一个帖子是否成功,也无法确定是否应该使用rePOST。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13316357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档