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();
    });
  }
}
相关推荐
大龄秃头程序员8 小时前
一次 Flutter 动画 Demo 的整理与复盘
flutter
AlexMaybeBot11 小时前
躺在沙发上开发 Openclaw 的移动端APP
前端·flutter
天空之城--12 小时前
Android Flutter行业动态与学习参考(2026年8月)
android·flutter
FungLeo13 小时前
Flutter Web token 存储陷阱:crypto.subtle 在非安全上下文失效排查实录
前端·安全·flutter
FungLeo13 小时前
Flutter Web 中文字体困境与渲染器选择:CanvasKit vs HTML renderer 实战
前端·flutter·html
杉氧14 小时前
原生交互:如何在 Flutter 中嵌入 Android/iOS 原生组件并解决手势冲突
android·flutter·dart
恋猫de小郭15 小时前
Flutter iOS Deep Link 为什么会突然失效:一系列难以言喻的问题
android·前端·flutter
FungLeo1 天前
Flutter fl_chart 0.70 破坏性 API 迁移实录:duration/getTooltipColor/withValues 全解
flutter·fl_chart
FungLeo1 天前
Flutter 吸顶分组列表实战:语义桶分组 + 点击头平滑滚动
android·flutter
FungLeo1 天前
Flutter 超长 StatefulWidget 拆分术:part of + extension on State 实战
android·flutter·dart