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 客户端的更多信息和解决方案也可以在这里找到:

https://github.com/flutter/flutter/issues/20376

一般来说,如果您遇到此问题,则意味着您的 Flutter 应用程序出于某种原因忽略了系统代理设置,或者它不信任 Fiddler 的 HTTPS 证书。

您通常可以通过使用该应用程序并检查其日志来区分:如果该应用程序运行正常且日志也正常,则它可能完全忽略了 Fiddler。如果应用程序无法连接到互联网,尤其是 logcat 中有 security/TLS/certificate 警告,则它可能不信任证书。

如果代理不受信任,您需要在您的代码中执行此操作,或者使用配置一个单独的应用程序,该应用程序可以通过充当 VPN 为您强制执行代理设置。如果证书不受信任,您需要在应用的 network security settings.

中进行配置

尽管,Fiddler 对于Android 来说并不是一个很好的选择。使用内置 Android 支持的工具可能会更好 - 我一直在构建它,它是一个名为 HTTP Toolkit 的开源项目,可以为所有 Android 执行此操作应用程序,包括任何使用 Flutter 构建的应用程序:

它为您完成所有 VPN 代理执行工作,一键设置且无需更改代码,它还可以自动处理证书设置(甚至是系统级证书,在模拟器和 root 设备上)。这应该消除您进入这种情况的两种方式。

除此之外,它与 Fiddler 非常相似:一个拦截代理,可让您检查和重写来自您喜欢的任何客户端的 HTTPS。