解决:Charles 抓不到 Flutter 网络接口请求

本文解决Flutter应用使用Charles抓包失败的问题,介绍了不走系统代理的原因及解决方案,包括在代码中动态设置代理的方法,并提供了HttpClient和Dio库的具体配置示例。

一、说明

我们在做应用开发的时候,经常需要利用一些工具抓取网络请求接口,这样可以极大的方便接口联调。但是在用 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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值