charles抓包flutter

一,准备工作

在我的另一篇文章flutter Dio发送post请求-CSDN博客里面,直接复用一部分代码

该方法无需让手机安装charles的ca证书(当然安装了也没事儿),也无需设置手机wifi的网络代理(因为ca证书的内容和网络代理都写进dart代码中了)

注:需要先打开charles作为代理,手机和电脑在同一局域网中(或者电脑or手机一个开热点给另一个连上)

二,coding

Dart 复制代码
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:dio/adapter.dart';

final Dio dio = Dio();

class AcceptCA extends HttpOverrides {
  // 信任证书
  @override
  HttpClient createHttpClient(SecurityContext? context) {
    SecurityContext securityContext = SecurityContext(withTrustedRoots: true);
    // ca证书的内容
    var caContent = Uint8List.fromList(utf8.encode('''-----BEGIN CERTIFICATE-----
MIIFKjCCBBKgAwIBAgIGAZIDF60vMA0GCSqGSIb3DQEBCwUAMIGZMSowKAYDVQQDDCFDaGFybGVz
IFByb3h5IENBICgxOCBTZXAgMjAyNCwgTCkxJTAjBgNVBAsMHGh0dHBzOi8vY2hhcmxlc3Byb3h5
LmNvbS9zc2wxETAPBgNVBAoMCFhLNzIgTHRkMREwDwYDVQQHDAhBdWNrbGFuZDERMA8GA1UECAwI
QXVja2xhbmQxCzAJBgNVBAYTAk5aMB4XDTI0MDkxNzAzMDUzNloXDTI1MDkxNzAzMDUzNlowgZkx
KjAoBgNVBAMMIUNoYXJsZXMgUHJveHkgQ0EgKDE4IFNlcCAyMDI0LCBMKTElMCMGA1UECwwcaHR0
cHM6Ly9jaGFybGVzcHJveHkuY29tL3NzbDERMA8GA1UECgwIWEs3MiBMdGQxETAPBgNVBAcMCEF1
Y2tsYW5kMREwDwYDVQQIDAhBdWNrbGFuZDELMAkGA1UEBhMCTlowggEiMA0GCSqGSIb3DQEBAQUA
A4IBDwAwggEKAoIBAQC7B4T2grKCDC0SH/W9v+lbZMYL9R4d34Xhe/g4l+MC38GYfq4oonIprMbb
wNpeSvlrriDeImp1/lGJsj3kkY3tcySki5IeNzpEEvBrsssExiecGKQNE2jg3sdNPChacL+rpuUy
pKs20Ciu/Xoz5ut4PxD2/D43Jfm/cBf25wZN97539EV7NjZl1lLTZL0u9YoVkBbJmY5WFQpvHVv2
r+SqVJjhio2gABkQITwbjBOmIWBggy1P8Fsv4KzbLxaO2hl8hFiehiJgNtLnEzgAU8Cby8CtEuFx
Xl2nkWCFK0RG30BLiLCsoeJyPJCOi4HQjM7EQhgsDr+aZ5aSZQ7tJd61AgMBAAGjggF0MIIBcDAP
BgNVHRMBAf8EBTADAQH/MIIBLAYJYIZIAYb4QgENBIIBHROCARlUaGlzIFJvb3QgY2VydGlmaWNh
dGUgd2FzIGdlbmVyYXRlZCBieSBDaGFybGVzIFByb3h5IGZvciBTU0wgUHJveHlpbmcuIElmIHRo
aXMgY2VydGlmaWNhdGUgaXMgcGFydCBvZiBhIGNlcnRpZmljYXRlIGNoYWluLCB0aGlzIG1lYW5z
IHRoYXQgeW91J3JlIGJyb3dzaW5nIHRocm91Z2ggQ2hhcmxlcyBQcm94eSB3aXRoIFNTTCBQcm94
eWluZyBlbmFibGVkIGZvciB0aGlzIHdlYnNpdGUuIFBsZWFzZSBzZWUgaHR0cDovL2NoYXJsZXNw
cm94eS5jb20vc3NsIGZvciBtb3JlIGluZm9ybWF0aW9uLjAOBgNVHQ8BAf8EBAMCAgQwHQYDVR0O
BBYEFD8hFf1Rncg+7ulyepOQ2uQrb8NcMA0GCSqGSIb3DQEBCwUAA4IBAQBXdrCNt+0gUOGRzIz7
JjyfVOicqcSjDrB3rSDjJC++BEQgBMNeeC/N8UxmVPar9lKN9aONoT3ylsSXG9vv2iuL2bJosz9y
Wf4VREg37JFFMRc87/MzvihTjvHHGC7KR4KcI3rE+d6S3Llq+LkakCdQZ343HTUi9NcNyF7sddl5
hh0Hf/00VJ63CZ1wHh5lW0XoRtnjpZScIVOKXvWmC405lCliWFhN4kC0M2+cXcT5Sy2FA22xE8ui
gUCIQZa/D623B/SYMKdbxT3aZSoFxkCaiGAh4LHmZ5vogm9OTc2hOzDssUbrTxyLFBwzXKQlHBTQ
bDi7/SxEYgwQ2XVEDBm/
-----END CERTIFICATE-----'''));
    securityContext.setTrustedCertificatesBytes(caContent);
    return super.createHttpClient(securityContext);
  }
}

main() {
  runApp(const MaterialApp(
    home: H(),
  ));
}

class H extends StatefulWidget {
  const H({super.key});

  @override
  State<H> createState() => _HState();
}

class _HState extends State<H> {
  String _resStr = "";

  @override
  void initState() {
    super.initState();
    HttpOverrides.global = AcceptCA();
    // 设置网络代理
    (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
        (HttpClient client) {
      client.badCertificateCallback =
          (X509Certificate cert, String host, int port) => true;
      client.findProxy = (uri) => 'PROXY 192.168.111.111:8888';
    };
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: const Text("抓包测试"),
        ),
        body: Center(
          child: Text(
            _resStr,
            style: const TextStyle(fontSize: 30),
          ),
        ),
        floatingActionButton:
            FloatingActionButton(onPressed: _postRequestFunction));
  }

  void _postRequestFunction() async {
    FormData formData = FormData.fromMap({"sourceText": "Who are you?"});
    String url = "https://api.oioweb.cn/api/txt/QQFanyi";
    Response response = await dio.post(url, data: formData);
    setState(() {
      _resStr =
          json.decode(response.toString())["result"]["targetText"].toString();
    });
  }
}
相关推荐
stringwu1 天前
Flutter 开发必备:MVI 架构的高效实现指南
前端·flutter
程序员老刘2 天前
Flutter版本选择指南:3.44系列继续观望 | 2026年6月
flutter·ai编程·客户端
用户965597361904 天前
Provider vs Bloc vs GetX vs Riverpod:Flutter 状态管理方案怎么选?
flutter
恋猫de小郭4 天前
Flutter Patchwork,不用 Fork 改依赖包源码的第三方工具
android·前端·flutter
程序员老刘4 天前
跑分第一的编程大模型,我为啥不用?
flutter·ai编程·vibecoding
恋猫de小郭5 天前
苹果 AirPods 协议,Android 也可以使用完整版 AirPods 能力
android·前端·flutter
张风捷特烈5 天前
Flutter 类库大揭秘#01 | path_provider架构与设计
android·flutter
恋猫de小郭7 天前
Android 限制侧载新进展,谷歌联合国内厂商推验证计划
android·前端·flutter
恋猫de小郭7 天前
解读 Android 17 全新内存限制,有没有“豁免”后门?
android·前端·flutter
程序员老刘10 天前
跨平台开发地图 | 2026年6月
flutter·ai编程·客户端