首页 新闻 会员 周边 捐助

微信重复请求

0
悬赏园豆:15 [已解决问题] 解决于 2021-12-08 15:46

安卓机微信跨域请求浏览器服务后台,会偶尔出现:响应超过10S,安卓机会默认转发请求,两次数据一模一样,后台区分不出来,但是又需要拿到第一次请求的结果。后台还要考虑区分出是客户人为的二次请求和微信默认的二次请求。有什么好办法能限制住二次请求或者区分两次的请求吗?限制住或区分开之后,有什么好的办法取到第一次的结果返回给前台?(循环查询,线程等待拿第一次结果这个感觉不是太好)

迷茫呀的主页 迷茫呀 | 初学一级 | 园豆:197
提问于:2019-03-22 13:54
< >
分享
最佳答案
1

每次请求后面跟个参数flag,可以用当前时间的时分秒,也可以用GUID。判断的时候,两次请求的参数flag如果相同,说明是转发的,如果后面的参数不同,说明是人为发起的二次请求。

收获园豆:15
顾星河 | 大侠五级 |园豆:7288 | 2019-03-22 14:03

区分开之后,有什么好的办法取到第一次的结果返回给前台?(循环查询,线程等待拿第一次结果这个感觉不是太好)

迷茫呀 | 园豆:197 (初学一级) | 2019-03-22 14:26

@迷茫呀: 一般的为了防止重复插入数据,在插入之前都会做一次查询,不存在则插入。同理,在做查询的时候做一个过滤,当前相同的查询不存在则查询:把所有的flag存在集合里,当集合存在这个查询的这个flag时,不进行查询,只有当不存在的时候,才执行查询。 如果是默认转发的请求,那么第二次的flag肯定和第一次的一样,第一次的flag已经存在集合里了,第二次再去请求时就无效了,但是第一次的flag由于不在集合里,所以该查直接查即可,不用等。这里涉及几个点:1,集合用什么存,全局的static变量或者程序里的缓存 2.每次请求当flag不在集合里时,将当前flag插入集合(这是为了不做第二次查询使用) 这个集合其实就是相当于一个临时的查询记录,起的作用是存在相同记录则不查。

顾星河 | 园豆:7288 (大侠五级) | 2019-03-22 16:04

@自闭玩家: 这个场景在不是查询表,是这样的:是微信请我们系统,我们后台系统会做一系列的处理,然后会再次另外的第三个系统,需要拿到第三系统返回的结果,我们以此来判断查插入我们自己数据库,并且返回给前台页面相对应的结果。你说的:我有点没明白的是:如果标识不去第二次请求,那时候这个线程拿的肯定是第二次的处理结果,那如何拿到第三系统第一次返回的结果。
注:第三系统结果会判断我们的请求中的唯一标示,如果两次中的唯一标识是一样的,第一次成功之后,第二次会返回重复插入。

迷茫呀 | 园豆:197 (初学一级) | 2019-03-29 10:50
其他回答(1)
0

我觉得直接解决请求超过10s这事比较靠谱,也简单一点。先返回一个结果,然后通过这个结果再进行业务处理后的最终结果。毕竟,你现在的方案徒增服务器负担,用户体验还不见得好。

首席吐槽官秦寿 | 园豆:601 (小虾三级) | 2019-03-24 22:46

这个暂时解决不了,老系统,然后还有请求第三方系统,返回的时间是不固定的。

支持(0) 反对(0) 迷茫呀 | 园豆:197 (初学一级) | 2019-03-29 10:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册