在日常工作中特别是高安全级别的android电商项目经常会出现一种异常情况——当客户发起一个2元 的消费请求时,由于网络延迟导致请求异常,客户再次提交2元消费请求,消费成功,但是客户会发现他消费了4元。投诉是在所不免的了,可是为什么会有这种问题出现呢?带着这个问题,我们接着往下看。
我们要了解这种异常现象时,首先要能还原这种场景,但是网络延迟这种场景并不常见。因此我们先要去学习一个工具——fiddler抓包工具 ,这个工具里面有模拟弱网环境的功能。
下载地址:https://www.telerik.com/fiddler
一路next,安装完后进入如下界面
一、android抓包原理
在本机开启了一个http的代理服务器,然后它会转发所有的http请求和响应。Fiddler 是以代理web 服务器的形式工作的,它使用代理地址:127.0.0.1,端口:8888。网络请求走fiddler,fiddler从中拦截数据,由于fiddler充当中间人的角色,所以可以解密https。因此,它比一般的firebug或者是chrome自带的抓包工具要好用的多。不仅如此,它还可以支持请求重放等一些高级功能。
在android手机上进行抓包的准备:
1、在PC上安装好Fiddler
2、CMD中使用ipconfig查找到PC上的IP
3、手机和PC在同一网络上
4、在手机上设置代理,代理地址填上PC查到的IP地址
二、设置Fiddler
菜单:Tools-> Options->Connections,勾选"Allow remote computers to connect"
记住端口如果没有设置好的话,自己可以改,写一个没有被占用的端口,我使用的是默认的8888。设置完了记住要重新启动fiddler,不然可能会无效 。
接下来在手机的WIFi选项中找到修改网络,在代理项选上手动,然后输入PC查询到的IP地址,端口号写上在fiddler设置的端口,点击保存就好。这些就不截图了。
三、开启弱网测试
菜单:Rules-> customize Rules
按照上面步骤会进入一个编辑界面,Ctrl+F输入simulate查找,找到如下界面修改数值就好,我修改为延迟5秒:
if (m_SimulateModem) {
// Delay sends by 300ms per KB uploaded.
oSession["request-trickle-delay"] = "5000";
// Delay receives by 150ms per KB downloaded.
oSession["response-trickle-delay"] = "5000";
}
修改完后记得保存好,关闭界面,回到主页后选择:
菜单:Rules-> performance->simulate modem speeds
开启延迟,再点击就是关闭,这就是弱网测试的环境搭建。
下面开始讲讲响应超时和连接超时,什么是响应超时?什么是连接超时?
ConnectException : 指的是服务器请求超时 SocketTimeoutException:指的是服务器响应超时 可以在代码里设置 //请求超时 httpclient.getParams().setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,reqTimeout); //响应超时 httpclient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, resTimeout);这里两个异常都会在请求失败的回调方法中抛出的异常中进行检测,当这两种情况发生时,我们要怎么处理呢?
处理方法:当一笔交易,如果请求失败,那可以允许用户再次提交。 如果是响应失败,那就说明用户提交成功了,应该防止用户再次提交。
原创:https://blog.youkuaiyun.com/weixin_40600325/article/details/85116486