我正在使用 Flutter/Dart 开发移动应用程序。我需要的是使用 Charles 代理/Fiddler 调试/测试我的应用程序的网络流量。使用 Charles 代理可以轻松检查 dart/flutter 中的 http 请求/响应。我们只需要告诉 HttpClient 代理服务器的地址(安装 Charles 的机器的 IP 地址),如下所示:
final client = HttpClient();
client.findProxy = (uri) {
String proxy = '1.2.3.4:8888';
return "PROXY $proxy;";
};
client.badCertificateCallback =
((X509Certificate cert, String host, int port) => Platform.isAndroid);
但是我如何调试通过创建的 WebSocket 流量
WebSocket.connect('wss://server_address');
? WebSocket 没有任何用于设置代理设置的 api,我在论坛上找不到任何内容。
话虽这么说,我过去已经在另一个用 C# 编写的移动应用程序中做过这样的事情,而且非常简单。
想通了。实际上有多种方法可以做到这一点:
全局代理设置:
class ProxiedHttpOverrides extends HttpOverrides {
String _proxy;
ProxiedHttpOverrides(this. _proxy);
@override
HttpClient createHttpClient(SecurityContext? context) {
return super.createHttpClient(context)
..findProxy = (uri) {
return _proxy.isNotEmpty ? "PROXY $_proxy;" : 'DIRECT';
}
..badCertificateCallback = (X509Certificate cert, String host, int port) => Platform.isAndroid;
}
}
void main() {
String proxy = '1.2.3.4:8888';
HttpOverrides.global = new ProxiedHttpOverrides(proxy);
runApp(MyApp());
}
自定义 HttpClient 传递到 WebSocket.connect
HttpClient client = HttpClient();
client.findProxy = (uri) => "PROXY $proxy;";
client.badCertificateCallback = (X509Certificate cert, String host, int port) => Platform.isAndroid;
WebSocket.connect(url, customClient: client);
手动方式:我们需要使用带有指定代理设置的简单HttpClient升级到WebSocket。在这种情况下,我们将能够检查 Charles/Fiddler 中的 WebSocket 流量。
Future<WebSocket> createProxySocket() async {
String url = 'https://echo.websocket.org:443';//address must start from http(s)://, not from ws(s)://, as we are connecting using http
String proxy = '1.2.3.4:8888';//your machine address (or localhost if debugging on the same machine)
Random r = new Random();
String key = base64.encode(List<int>.generate(8, (_) => r.nextInt(255)));
HttpClient client = HttpClient();
client.findProxy = (uri) => "PROXY $proxy;";
client.badCertificateCallback = (X509Certificate cert, String host, int port) => Platform.isAndroid;
Uri uri = Uri.parse(url);
HttpClientRequest request = await client.getUrl(uri);
request.headers.add('Connection', 'upgrade');
request.headers.add('Upgrade', 'websocket');
request.headers.add('Sec-WebSocket-Version', '13');
request.headers.add('Sec-WebSocket-Key', key);
HttpClientResponse response = await request.close();
Socket socket = await response.detachSocket();
return WebSocket.fromUpgradedSocket(socket, serverSide: false);
}
在iOS上,您可以使用名为Hodor的数据包嗅探应用程序,它允许您直接捕获Flutter的网络数据包,而无需修改任何代码。您还可以将其配置为与 Charles 一起使用。它还支持捕获 TCP 和 UDP 流量。