【问题标题】:Flutter app not using Fiddler proxyFlutter 应用程序不使用 Fiddler 代理
【发布时间】:2018-03-02 10:35:01
【问题描述】:

我刚开始玩 Flutter,现在正在尝试做一些简单的 HTTP(s) 请求。我一直使用 Fiddler 和代理来调试从 android 应用发送的请求,但从 Flutter 发送的请求似乎没有显示。

有什么方法可以让 Fiddler 显示 Flutter 请求,或者我可以/应该使用其他一些 HTTP 请求调试工具/监视器吗?

【问题讨论】:

  • Fiddler 是用于浏览器的,对吧?为什么或如何工作?你试过什么?
  • FIddler 可以与代理结合使用,并且会记录所有通过代理的请求。问题是颤振似乎没有使用代理(大多数其他应用程序都使用)。我还尝试使用名为“Drony”的应用程序将请求转发给 Fiddler,但这仅显示 CONNECT 隧道,而不是请求本身。

标签: android fiddler flutter


【解决方案1】:

我用 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;
    }

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

    • 我将它安装在我的 linux pc 和 android 模拟器上。它没有在我的颤振应用程序(如提琴手)上显示任何网络请求
    • 这太令人惊讶了!它是否在 Android 模拟器上运行,并在那里显示为已连接?您使用的是什么模拟器和操作系统版本?请随时发送电子邮件至 help@httptoolkit.tech 了解更多详情,我会进行调查。
    【解决方案3】:

    我能够使用以下 sn-ps 让 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

    【讨论】:

      【解决方案4】:

      没有尝试过,但也许您可以继承 HttpClient 类,并覆盖您想要跟踪的方法,并在您想要跟踪时使用它?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-06
        • 1970-01-01
        • 1970-01-01
        • 2016-06-23
        相关资源
        最近更新 更多