Flutter配置代理抓包实现过程详解

 更新时间:2023年02月13日 16:30:32   作者:ifreeOvO  
这篇文章主要为大家介绍了Flutter配置代理抓包实现过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

背景

在开发Flutter中,我们经常需要对网络请求进行调试,而Flutter自带的devtool的network又不太好用,有时会出现请求成功,但是又看不到response返回(难道是我姿势不对?)。于是我就尝试通过抓包来查看请求

工具准备

  • 安装charles
  • 有时我们需要抓https的请求,此时用charles抓包的内容是加密的,看不到明文,这时候需要安装下Charles的证书来解决。点击help > SSL Proxying > Install Charles Root Certificate,安装到系统的钥匙串中。(这里借下了光哥小册里的截图)

点击证书,将信任选项改成始终信任

开启charles的代理。开启后,确认Proxy选项卡与下方画红线的地方显示一样

配置Flutter代理

完成工具准备后,由于Flutter默认不走系统代理,所以我们还需要手动在Flutter项目中配置代理,charles才能正确抓到包。这里提供两种方案,一种是在请求库的配置里设置代理,另一种是利用Flutter原生的类来完成

方式一、http请求库配置代理

dio配置代理

flutter项目里通常用dio库做http请求,我们可以通过dio的httpClientAdapter属性配置我们的本地代理。代码如下:

import 'package:dio/dio.dart';
var dio = Dio();
(dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
  (client) {
  client.findProxy = (uri) {
    return 'PROXY localhost:8888';
  };
  client.badCertificateCallback =
    (X509Certificate cert, String host, int port) => true; //忽略证书
};

其中client.findProxy函数用来返回我们的代理接口,charles的默认的系统代理端口是8888,所以这里配置成

PROXY localhost:8888就可以了。下面一句client.badCertificateCallback函数也很关键,如果不进行配置,charles在抓包https请求时会出现下图错误:

这个错误产生的原因,经我查阅网上资料是因为Flutter请求https时用的是自己的CA认证证书,所以charles在认证证书时没有通过,导致抓包错误。所以我们直接通过client.badCertificateCallback函数返回true来忽略证书就好了。

web_socket_channel配置代理

有了上面dio的配置后,还不够,因为我们的websocket请求还是无法抓包。如果你项目中需要抓取websocket,可以使用web_socket_channel这个库。需要注意的是这个库不能从官网拉取,因为官方的web_socket_channel的还不支持代理,我在官方的代码仓库看到有几个与支持代理相关的pr请求,但是官方都还没有进行合并分支,所以我就自己fork仓库修改了一下,我们可以改成以下方式进行安装:

dependencies:
  web_socket_channel:
      git:
        url: https://github.com/IFreeOvO/web_socket_channel.git
        ref: master

然后我们开始配置web_socket_channel,不过有了之前配置dio的经验后,我们配置web_socket_channel也是使用了差不多的思路,代码如下:

import 'package:web_socket_channel/io.dart';
// 创建一个自己的HttpClient对象
SecurityContext ctx = SecurityContext.defaultContext;
HttpClient client = HttpClient(context: ctx)
  ..findProxy = ((uri) {
    return 'PROXY localhost:8888';
  })
  ..badCertificateCallback = (cert, host, port) {
  return true;
};
_channel = IOWebSocketChannel.connect(
  'wss://xxx.com',
  customClient: client, // 使用定制的HttpClient
);

方式二、重写原生方法

在入口文件main.dart里定义一个HttpOverrides的子类,重写它的createHttpClient方法。原理也是一样的,把findProxybadCertificateCallback方法进行替换。然后挂载到全局。

// 重写HttpOverrides
class MyHttpOverrides extends HttpOverrides {
  @override
  HttpClient createHttpClient(SecurityContext? context) {
    var http = super.createHttpClient(context);
    http.findProxy = (uri) {
      return 'PROXY localhost:8888';
    };
    http.badCertificateCallback =
        (X509Certificate cert, String host, int port) => true;
    return http;
  }
}
void main() {
  HttpOverrides.global = MyHttpOverrides(); // 使用自己的HttpOverrides类
  runApp(MyApp());
}

这种方案的好处是不受第三方请求库限制,配置完后httpswebsocket都能正确抓包。效果如图:

以上就是Flutter配置代理抓包实现过程详解的详细内容,更多关于Flutter配置抓包的资料请关注脚本之家其它相关文章!

相关文章

  • Android仿微信底部菜单栏功能显示未读消息数量

    Android仿微信底部菜单栏功能显示未读消息数量

    这篇文章主要介绍了Android仿微信底部菜单栏功能,并显示未读消息数量,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • Android开发之使用SQLite存储数据的方法分析

    Android开发之使用SQLite存储数据的方法分析

    这篇文章主要介绍了Android开发之使用SQLite存储数据的方法,结合实例形式分析了Android使用SQLite数据库实现针对数据的增删改查操作相关技巧,需要的朋友可以参考下
    2017-07-07
  • Android开发实现图片大小与质量压缩及保存

    Android开发实现图片大小与质量压缩及保存

    这篇文章主要为大家介绍了Android开发实现图片大小与质量压缩及保存的方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • Android开发笔记之:Splash的实现详解

    Android开发笔记之:Splash的实现详解

    本篇文章是对Android中Splash的实现进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 利用Android中的TextView实现逐字显示动画

    利用Android中的TextView实现逐字显示动画

    在安卓程序启动的时候,想逐字显示一段话,每个字都有一个从透明到不透明的渐变动画。那如何显示这个效果,下面一起来看看。
    2016-08-08
  • kotlin中object关键字的三种使用场景

    kotlin中object关键字的三种使用场景

    这篇文章主要给大家介绍了关于kotlin中object关键字的三种使用场景,文中通过示例代码介绍的非常详细,对大家学习或者使用kotlin具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-06-06
  • 代码分析Android消息机制

    代码分析Android消息机制

    本文通过代码实例详细分析了Android消息机制的相关知识点,对此有需要的朋友可以参考学习下。
    2018-03-03
  • Android开发之ProgressDialog进度对话框用法示例

    Android开发之ProgressDialog进度对话框用法示例

    这篇文章主要介绍了Android开发之ProgressDialog进度对话框用法,简单介绍了ProgressDialog进度对话框常见函数功能,并结合实例形式分析了ProgressDialog组件创建及使用进度对话框相关操作技巧,需要的朋友可以参考下
    2019-03-03
  • 详解Android WebView监听console错误信息

    详解Android WebView监听console错误信息

    这篇文章主要介绍了Android WebView监听console错误信息,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • ListView的Adapter使用 之 初学ArrayAdapter String

    ListView的Adapter使用 之 初学ArrayAdapter String

    ListView是Android中经常会使用的东西,绑定数据对于初学者来说,尤其是刚接触编程的人来说,往往会觉得很难理解,我上大二的时候学的java,但是基本上相当于没有学,什么都没写过,真正接触编程就是开始上手学android,把这些记录下来,自己可以回头看下,也可以让新手更好的理解
    2013-06-06

最新评论