charles 抓包flutter的抓不到

 

您好,关于 Charles 抓不到 Flutter 应用的网络请求,这是一个非常常见且令人困扰的问题。根据现有信息,其根本原因在于 Flutter 应用的网络请求默认不走系统代理,而 Charles 抓包的核心机制正是基于拦截系统代理的流量。

🔍 问题根源

Charles 作为代理服务器,需要将设备(手机或模拟器)的网络流量引导至 Charles 所在的电脑进行拦截和分析。然而,许多 Flutter 应用在进行网络请求时,会绕过系统的全局代理设置,直接连接服务器。因此,即使您在手机上正确配置了 Charles 的代理,Flutter 应用的请求也不会经过 Charles,导致抓包失败。

✅ 解决方案

要解决此问题,需要在 Flutter 应用的代码中显式地为网络请求客户端设置代理。以下是针对两种最常用的网络请求库的解决方案。

1. 使用 `HttpClient` 设置代理

如果您使用的是 Dart 内置的 `HttpClient`,可以通过设置 `findProxy` 回调函数来指定代理。

```dart
import 'dart:io';

HttpClient client = HttpClient();
// 设置代理,仅在调试模式下开启
client.findProxy = (uri) {
// 使用一个开关来控制代理的开启与关闭,上线前务必关闭
return AppConstant.isDebug ? "PROXY 192.168.5.5:8888" : 'DIRECT';
};
// 使用 client 发起请求...
```

2. 使用 `Dio` 设置代理

如果您使用的是第三方库 `Dio`,可以通过其适配器来设置代理。

```dart
import 'package:dio/dio.dart';

Dio dio = Dio();
// 设置代理
(dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (client) {
client.findProxy = (Uri uri) {
// 同样,使用开关控制
return AppConstant.isDebug ? 'PROXY 192.168.5.5:8888' : 'DIRECT';
};
};
// 使用 dio 发起请求...
```

重要提示:在上面的代码示例中,`192.168.5.5` 需要替换为您电脑在局域网中的实际 IP 地址,`8888` 是 Charles 的默认代理端口。

📝 操作步骤与注意事项

1. 获取电脑 IP 地址:在 Mac 上,可以按住 `Option` 键再点击菜单栏的 Wi-Fi 图标查看 IP;在 Windows 上,可以打开命令提示符输入 `ipconfig` 查看。确保手机与电脑连接同一 Wi-Fi。
2. 确保 Charles 正常运行:启动 Charles,确认其代理端口(默认 8888)正在监听。
3. 配置手机代理(可选但推荐):虽然 Flutter 可能不走系统代理,但为确保万无一失,以及抓取其他应用的流量,建议仍按常规步骤在手机 Wi-Fi 设置中配置 Charles 的代理。
4. 安装 Charles 证书:为了抓取 HTTPS 流量,必须在手机上安装 Charles 的根证书。可以通过 Charles 菜单 `Help` -> `SSL Proxying` -> `Install Charles Root Certificate on a Mobile Device` 来生成并安装证书,安装后需在手机的“描述文件与设备管理”中信任该证书。
5. 重启应用:在代码中添加代理设置后,务必重启 Flutter 应用,使代理配置生效。
6. 上线前关闭代理:这是最关键的一步! 务必在应用发布前,将代理开关 `AppConstant.isDebug` 设置为 `false` 或直接移除代理代码。否则,所有网络请求都会因代理失效而失败,造成严重生产事故。

💎 总结

抓不到 Flutter 抓包的核心在于 “不走系统代理”。解决方案是 在代码中为网络客户端显式设置代理。请按照上述步骤操作,并特别注意上线前关闭代理的安全风险。

希望这些信息能帮助您顺利解决问题。

posted @ 2025-12-09 10:32  黄增松  阅读(0)  评论(0)    收藏  举报