Flutter网络捕获插件network_capture的使用

Flutter网络捕获插件network_capture的使用

Flutter开发者/测试人员网络调试工具,轻松查看HTTPS请求

注意

如果您想复制内容,可以尝试双击或长按。

使用方法

添加依赖

pubspec.yaml文件中添加network_capture插件的依赖:

dependencies:
    network_capture: ^latest_version
修改应用程序

将你的应用修改为NetworkCaptureApp

void main() {
  runApp(NetworkCaptureApp(
    enable: true,
    navigatorKey: navigatorKey,
    child: const MyApp(),
  ));
}
添加捕获拦截器

CaptureDioInterceptor添加到Dio拦截器中:

dio.interceptors.add(CaptureDioInterceptor());

重要!禁止在发布环境中使用。我们不对任何由此引发的问题负责。


完整示例代码

以下是一个完整的示例代码,展示了如何使用network_capture插件来捕获HTTP请求。

import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:network_capture/network_capture.dart';

// 创建一个全局的NavigatorKey
final navGK = GlobalKey<NavigatorState>();

void main() {
  // 运行NetworkCaptureApp,并传递必要的参数
  runApp(NetworkCaptureApp(
    navigatorKey: navGK,
    enable: true,
    child: const MyApp(),
  ));
}

// 定义一个简单的MaterialApp
class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Network Capture',
      navigatorKey: navGK,
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
        useMaterial3: false,
      ),
      home: const MyHomePage(title: 'NetworkCapture'),
    );
  }
}

// 定义一个状态fulWidget
class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String result = ''; // 存储请求结果
  late Dio dio; // 创建Dio实例

  [@override](/user/override)
  void initState() {
    super.initState();
    // 初始化Dio并添加CaptureDioInterceptor
    dio = Dio()..interceptors.add(CaptureDioInterceptor());
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.blue,
        title: Text(
          widget.title,
          style: const TextStyle(color: Colors.white),
        ),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Row(
              children: [
                // 添加一个获取请求的按钮
                GestureDetector(
                  onTap: () => _get(),
                  child: Container(
                    color: Colors.blue,
                    padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 16),
                    child: const Text(
                      'Get Request',
                      style: TextStyle(color: Colors.white),
                    ),
                  ),
                ),
                const SizedBox(width: 10),
                // 添加一个发送POST请求的按钮
                GestureDetector(
                  onTap: () => _post(),
                  child: Container(
                    color: Colors.blue,
                    padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 16),
                    child: const Text(
                      'Post Request',
                      style: TextStyle(color: Colors.white),
                    ),
                  ),
                ),
              ],
            ),
            Padding(
              padding: const EdgeInsets.only(top: 8.0),
              child: Text('请求结果: $result'),
            ),
          ],
        ),
      ),
    );
  }

  // 发送GET请求的方法
  void _get() {
    dio.get('https://www.wanandroid.com/banner/json',
        queryParameters: {'id': '323', 'name': 'azhon'}).then((value) {
      setState(() {
        result = value.toString();
      });
    });
  }

  // 发送POST请求的方法
  void _post() {
    dio.post('https://www.wanandroid.com/user/login',
        data: {'username': 'a_zhon', 'password': '12345'}).then((value) {
      setState(() {
        result = value.toString();
      });
    });
  }
}

更多关于Flutter网络捕获插件network_capture的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网络捕获插件network_capture的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,关于Flutter中的network_capture插件的使用,这里是一个简单的代码案例来展示其基本功能。network_capture插件可以帮助开发者在开发过程中捕获和分析应用的网络请求。

首先,确保你已经在pubspec.yaml文件中添加了network_capture依赖:

dependencies:
  flutter:
    sdk: flutter
  network_capture: ^最新版本号  # 请替换为实际的最新版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter应用中配置和使用network_capture。以下是一个简单的示例:

import 'package:flutter/material.dart';
import 'package:network_capture/network_capture.dart';
import 'package:http/http.dart' as http;

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Network Capture Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  NetworkCapture? _networkCapture;
  List<NetworkRequest> _requests = [];

  @override
  void initState() {
    super.initState();
    _setupNetworkCapture();
  }

  @override
  void dispose() {
    _networkCapture?.stop();
    super.dispose();
  }

  void _setupNetworkCapture() {
    _networkCapture = NetworkCapture()
      ..start(includeRequestBody: true, includeResponseBody: true)
      ..addListener(() {
        setState(() {
          _requests = _networkCapture!.requests;
        });
      });
  }

  void _makeRequest() async {
    try {
      var response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/todos/1'));
      print('Response status: ${response.statusCode}');
      print('Response body: ${response.body}');
    } catch (e) {
      print('Request failed: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Network Capture Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            ElevatedButton(
              onPressed: _makeRequest,
              child: Text('Make Network Request'),
            ),
            SizedBox(height: 16),
            Text('Captured Requests:', style: TextStyle(fontWeight: FontWeight.bold)),
            SizedBox(height: 8),
            Expanded(
              child: ListView.builder(
                itemCount: _requests.length,
                itemBuilder: (context, index) {
                  var request = _requests[index];
                  return Padding(
                    padding: const EdgeInsets.symmetric(vertical: 8.0),
                    child: Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: <Widget>[
                        Text('Request URL: ${request.url}'),
                        Text('Request Method: ${request.method}'),
                        Text('Request Headers: ${request.headers}'),
                        if (request.requestBody != null)
                          Text('Request Body: ${request.requestBody!}'),
                        Text('Response Status Code: ${request.response?.statusCode}'),
                        if (request.responseBody != null)
                          Text('Response Body: ${request.responseBody!}'),
                      ],
                    ),
                  );
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}

class NetworkRequest {
  String url;
  String method;
  Map<String, String> headers;
  String? requestBody;
  http.Response? response;
  String? responseBody;

  NetworkRequest({
    required this.url,
    required this.method,
    required this.headers,
    this.requestBody,
    this.response,
    this.responseBody,
  });
}

注意

  1. network_capture插件的API可能会随着版本更新而变化,请参考最新的官方文档进行调整。
  2. 上述代码中的NetworkRequest类是一个简单的示例,用于展示捕获的请求信息。在实际使用中,你可能需要根据捕获的数据结构进行调整。
  3. 由于network_capture插件可能依赖于拦截HTTP请求,因此在实际应用中,请确保遵守隐私政策和相关法律法规。

这个示例展示了如何使用network_capture插件捕获网络请求,并在UI中显示请求和响应的详细信息。你可以根据需要进一步扩展和定制这个示例。

回到顶部