http__impl.dart文件中的_HttpClient类中定义了_findProxy的默认值
Function _findProxy = HttpClient.findProxyFromEnvironment;HttpClient类中findProxyFromEnvironment方法的实现
static String findProxyFromEnvironment(Uri url, {Map<String, String> environment}) { HttpOverrides overrides = HttpOverrides.current; if (overrides == null) { return _HttpClient._findProxyFromEnvironment(url, environment); } return overrides.findProxyFromEnvironment(url, environment);}_HttpClient类中_findProxyFromEnvironment方法的实现
static String _findProxyFromEnvironment( Uri url, Map<String, String> environment) { checkNoProxy(String option) { if (option == null) return null; Iterator<String> names = option.split(",").map((s) => s.trim()).iterator; while (names.moveNext()) { var name = names.current; if ((name.startsWith("[") && name.endsWith("]") && "[${url.host}]" == name) || (name.isNotEmpty && url.host.endsWith(name))) { return "DIRECT"; } } return null; } checkProxy(String option) { if (option == null) return null; option = option.trim(); if (option.isEmpty) return null; int pos = option.indexOf("://"); if (pos >= 0) { option = option.substring(pos + 3); } pos = option.indexOf("/"); if (pos >= 0) { option = option.substring(0, pos); } // Add default port if no port configured. if (option.indexOf("[") == 0) { var pos = option.lastIndexOf(":"); if (option.indexOf("]") > pos) option = "$option:1080"; } else { if (option.indexOf(":") == -1) option = "$option:1080"; } return "PROXY $option"; } // Default to using the process current environment. if (environment == null) environment = _platformEnvironmentCache; String proxyCfg; String noProxy = environment["no_proxy"]; if (noProxy == null) noProxy = environment["NO_PROXY"]; if ((proxyCfg = checkNoProxy(noProxy)) != null) { return proxyCfg; } if (url.scheme == "http") { String proxy = environment["http_proxy"]; if (proxy == null) proxy = environment["HTTP_PROXY"]; if ((proxyCfg = checkProxy(proxy)) != null) { return proxyCfg; } } else if (url.scheme == "https") { String proxy = environment["https_proxy"]; if (proxy == null) proxy = environment["HTTPS_PROXY"]; if ((proxyCfg = checkProxy(proxy)) != null) { return proxyCfg; } } return "DIRECT";}从以上代码中可以发现代理配置从environment中读取 , 设置代理时必须指定http_proxy或https_proxy等 。而从_openUrl方法实现中proxyConf = new _ProxyConfiguration(_findProxy(uri));得出默认情况下environment是为空的,所以要想在Flutter的http请求中使用代理 , 则要指定相应的代理配置 , 即设置httpClient.findProxy的值 。示例代码:
_getHttpData() async { var httpClient = new HttpClient(); httpClient.findProxy = (url) { return HttpClient.findProxyFromEnvironment(url, environment: {"http_proxy": 'http://192.168.124.7:8888',}); }; var uri = new Uri.http('t.weather.sojson.com', '/api/weather/city/101210101'); var request = await httpClient.getUrl(uri); var response = await request.close(); if (response.statusCode == 200) { print('请求成功'); var responseBody = await response.transform(Utf8Decoder()).join(); print('responseBody = $responseBody'); } else { print('请求失败'); }}以上代码设置后即可使用Fiddler或Charles抓包了 。
敲黑板?。。〈胫幸焉柚么? ,手机wifi不再需要进行代理设置;192.168.124.7该IP为我们需要抓包的Charles所在电脑IP 。
查了好多资料绝大多数是在代码中设置代理,或者是代码设置了,然后让其走手机代理,或许这对于开发很容易但是对于测试,或者别人家的APP或许就不是很容易了 。下面我们看看下边的方案 。
4.使用VPN使用VPN将终端设备的流量转发到代理服务器 。说的好听点就是使用VPN,难听点就是使用Drony工具强行使APP走代理 。
优势:使用VPN软件不用添加其他测试 。
劣势:终端上的VPN默认会直接对所有流量进行转发,要进行合理的配置可能需要额外的学习成本 。
因为我们的测试对象是手机移动APP,因为我们的测试对象是手机移动APP,所以我们首先要在手机上安装一个VPN,这里使用一个十分方便的VPN软件drony (介绍在这里https://github.com/SuppSandroB/sandrop/wiki/Drony-FAQ),drony会在你的手机上创建一个VPN,将手机上的所有流量都重定向到drony自身(不是流向vpn服务器) ,这样drony就可以管理所有手机上的网络流量,甚至可以对手机上不同APP的流量进行单独配置 。
4.1下载安装Drony1.下载对应的安装包到手机上安装好,宏哥这里还是用夜神模拟器做演示,访问其下载地址:https://drony.soft112.com/ 翻不了墙的,用这个地址下载:https://www.appsapk.com/drony-1-3-155/,如下图所示:

文章插图
2.下载安装包并安装好 。安装完成后打开软件 , 如下图所示:
推荐阅读
- 《上传那些事儿之Nest与Koa》——文件格式怎么了!
- 《穿越火线》怎么改房间名字(穿越火线怎么修改房间名最新)
- 30 《吐血整理》高级系列教程-吃透Fiddler抓包教程-Fiddler如何抓取Android7.0以上的Https包-番外篇
- 山海情的原著小说_山海情是根据什么小说改编的
- 唐人街探案3剧情详解_唐人街探案3讲了什么剧情
- python渗透测试入门——基础的网络编程工具
- 茜茜公主?弗兰茨 弗兰茨有多爱茜茜公主
- 《梦幻西游》怎么赚钱(梦幻老区赚钱攻略)
- GLA 论文解读《Label-invariant Augmentation for Semi-Supervised Graph Classification》
- 简读《ASP.NET Core技术内幕与项目实战》之3:配置