Flutter 应用程序未使用 Fiddler 代理
Flutter app not using Fiddler proxy
我刚开始玩 Flutter,现在正在尝试做一些简单的 HTTP(s) 请求。我一直使用带代理的 Fiddler 来调试从 android 应用程序发送的请求,但是从 Flutter 发送的请求似乎没有显示。
有什么方法可以让 Fiddler 显示 Flutter 请求,或者是否有一些其他 HTTP 请求调试 tool/monitor 我 can/should 使用?
还没有尝试过,但也许你可以子class HttpClient class,并覆盖你想要跟踪的方法,并在你想要跟踪时使用它?
我对 Drony 进行了更多测试,并使其正常工作。还有一个问题,我无法再发送 HTTPS 请求,因为 Dart/Flutter 没有一种简单的方法来信任所有 SSL 证书。此时我可以调试 HTTP 请求。
我的 API 仅支持 HTTPS 请求,因此在我的 Flutter 应用程序中,我请求 HTTP 版本并通过 Fiddler 将其转发到 HTTPS API:
(以下代码进入 OnBeforeRequest 函数)
if (!oSession.isHTTPS && oSession.HostnameIs("api.xxxx.me")){
oSession.fullUrl = "https://" + "api.xxxx.me" + oSession.PathAndQuery;
}
我能够使用以下代码片段让 Charles Proxy 与 HttpClient 一起工作:
localhost 可以是你电脑的 ip 地址,比如 192.168.1.77
HttpClient client = HttpClient();
client.findProxy = (uri) {
return "PROXY localhost:3128;";
};
更完整的实现:
static HttpClient getHttpClient() {
HttpClient client = new HttpClient()
..findProxy = (uri) {
return "PROXY 192.168.1.199:8888;";
}
..badCertificateCallback =
((X509Certificate cert, String host, int port) => true);
return client;
}
其他 HTTP 客户端的更多信息和解决方案也可以在这里找到:
一般来说,如果您遇到此问题,则意味着您的 Flutter 应用程序出于某种原因忽略了系统代理设置,或者它不信任 Fiddler 的 HTTPS 证书。
您通常可以通过使用该应用程序并检查其日志来区分:如果该应用程序运行正常且日志也正常,则它可能完全忽略了 Fiddler。如果应用程序无法连接到互联网,尤其是 logcat 中有 security/TLS/certificate 警告,则它可能不信任证书。
如果代理不受信任,您需要在您的代码中执行此操作,或者使用配置一个单独的应用程序,该应用程序可以通过充当 VPN 为您强制执行代理设置。如果证书不受信任,您需要在应用的 network security settings.
中进行配置
尽管,Fiddler 对于Android 来说并不是一个很好的选择。使用内置 Android 支持的工具可能会更好 - 我一直在构建它,它是一个名为 HTTP Toolkit 的开源项目,可以为所有 Android 执行此操作应用程序,包括任何使用 Flutter 构建的应用程序:
它为您完成所有 VPN 代理执行工作,一键设置且无需更改代码,它还可以自动处理证书设置(甚至是系统级证书,在模拟器和 root 设备上)。这应该消除您进入这种情况的两种方式。
除此之外,它与 Fiddler 非常相似:一个拦截代理,可让您检查和重写来自您喜欢的任何客户端的 HTTPS。
我刚开始玩 Flutter,现在正在尝试做一些简单的 HTTP(s) 请求。我一直使用带代理的 Fiddler 来调试从 android 应用程序发送的请求,但是从 Flutter 发送的请求似乎没有显示。
有什么方法可以让 Fiddler 显示 Flutter 请求,或者是否有一些其他 HTTP 请求调试 tool/monitor 我 can/should 使用?
还没有尝试过,但也许你可以子class HttpClient class,并覆盖你想要跟踪的方法,并在你想要跟踪时使用它?
我对 Drony 进行了更多测试,并使其正常工作。还有一个问题,我无法再发送 HTTPS 请求,因为 Dart/Flutter 没有一种简单的方法来信任所有 SSL 证书。此时我可以调试 HTTP 请求。
我的 API 仅支持 HTTPS 请求,因此在我的 Flutter 应用程序中,我请求 HTTP 版本并通过 Fiddler 将其转发到 HTTPS API: (以下代码进入 OnBeforeRequest 函数)
if (!oSession.isHTTPS && oSession.HostnameIs("api.xxxx.me")){
oSession.fullUrl = "https://" + "api.xxxx.me" + oSession.PathAndQuery;
}
我能够使用以下代码片段让 Charles Proxy 与 HttpClient 一起工作:
localhost 可以是你电脑的 ip 地址,比如 192.168.1.77
HttpClient client = HttpClient();
client.findProxy = (uri) {
return "PROXY localhost:3128;";
};
更完整的实现:
static HttpClient getHttpClient() {
HttpClient client = new HttpClient()
..findProxy = (uri) {
return "PROXY 192.168.1.199:8888;";
}
..badCertificateCallback =
((X509Certificate cert, String host, int port) => true);
return client;
}
其他 HTTP 客户端的更多信息和解决方案也可以在这里找到:
一般来说,如果您遇到此问题,则意味着您的 Flutter 应用程序出于某种原因忽略了系统代理设置,或者它不信任 Fiddler 的 HTTPS 证书。
您通常可以通过使用该应用程序并检查其日志来区分:如果该应用程序运行正常且日志也正常,则它可能完全忽略了 Fiddler。如果应用程序无法连接到互联网,尤其是 logcat 中有 security/TLS/certificate 警告,则它可能不信任证书。
如果代理不受信任,您需要在您的代码中执行此操作,或者使用配置一个单独的应用程序,该应用程序可以通过充当 VPN 为您强制执行代理设置。如果证书不受信任,您需要在应用的 network security settings.
中进行配置尽管,Fiddler 对于Android 来说并不是一个很好的选择。使用内置 Android 支持的工具可能会更好 - 我一直在构建它,它是一个名为 HTTP Toolkit 的开源项目,可以为所有 Android 执行此操作应用程序,包括任何使用 Flutter 构建的应用程序:
它为您完成所有 VPN 代理执行工作,一键设置且无需更改代码,它还可以自动处理证书设置(甚至是系统级证书,在模拟器和 root 设备上)。这应该消除您进入这种情况的两种方式。
除此之外,它与 Fiddler 非常相似:一个拦截代理,可让您检查和重写来自您喜欢的任何客户端的 HTTPS。