一、说明
我们在做应用开发的时候,经常需要利用一些工具抓取网络请求接口,这样可以极大的方便接口联调。但是在用 Flutter 做应用开发时 Charles 却抓不到接口,到底是怎么回事呢 ?
尝试用其它客户端应用请求网络接口,Charles 都是可以成功抓取的,只有 Flutter 应用的接口无法抓到,到底是怎么回事呢 ?
经过一系列调研,发现 Flutter 应用的网络请求是不走手机的系统代理的,也就是说你在系统设置中设置了代理地址和端口号后 Flutter 也不会走你的代理,而抓接口是必须要设置代理的。
二、解决方案
如果不能走系统代理,那我们只有在代码中动态设置代理来解决问题了。我们一般会用 Dart 自带的 HttpClient 或 三方库 Dio 进行网络请求,而这两者也分别有它们自己的设置代理的方法。
1、HttpClient
HttpClient client = HttpClient();
client.findProxy = (uri) {
// 用1个开关设置是否开启代理
return AppConstant.isDebug ? "PROXY 192.168.5.5:8888" : 'DIRECT';
};
2、Dio
Dio dio = Dio();
// 设置代理用来调试应用
(dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (client) {
client.findProxy = (Uri) {
// 用1个开关设置是否开启代理
return AppConstant.isDebug ? 'PROXY 192.168.5.5:8888' : 'DIRECT';
};
};
三、问题
1、设置完地址后还是无法抓包
解决方案:重启应用。
四、补充
在应用调试的时候可以添加代理方便调试,但是上线前一定要把代理关闭,否则将造成极其严重的影响-------用户所有的网络请求都将失败。
上线前关闭代理!
上线前关闭代理!
上线前关闭代理!
重要的事情说3遍 !
五、参考文献
- https://github.com/flutterchina/dio/blob/master/README-ZH.md#%E8%AE%BE%E7%BD%AEHttp%E4%BB%A3%E7%90%86