Flutter网络请求日志记录插件talker_rhttp_logger的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

Flutter网络请求日志记录插件 talker_rhttp_logger 的使用

talker_rhttp_logger 是一个强大的 HTTP 日志拦截器,专为 rhttp 设计,并与 Talker 无缝集成。通过详细的、可自定义的日志记录功能,帮助你调试 HTTP 流量。

✨ 主要特性

  • 🔍 全面的HTTP日志记录 - 记录请求、响应和错误
  • 🎨 彩色输出 - 不同类型日志可以自定义颜色
  • 请求/响应过滤 - 控制哪些内容会被记录
  • 🛠 灵活配置 - 可以微调每个日志记录的细节
  • 🎯 性能优化 - 最小化日志记录带来的性能开销

📦 安装

在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  talker_rhttp_logger: ^latest_version  # 替换为最新版本号

然后运行:

flutter pub get

🚀 快速开始

下面是一个简单的示例,展示如何初始化 Talker 并创建带有日志记录功能的 HTTP 客户端:

import 'package:talker_rhttp_logger/talker_rhttp_logger.dart';
import 'package:talker/talker.dart';
import 'package:rhttp/rhttp.dart';

void main() {
  // 初始化 Talker
  final talker = Talker();
  
  // 创建带有日志记录功能的 HTTP 客户端
  final client = RHttpClient(
    interceptors: [
      TalkerRHttpLoggerInterceptor(
        talker: talker,
      ),
    ],
  );

  // 发起请求 - 日志会自动显示!
}

⚙️ 配置选项

基本配置

你可以通过 TalkerRhttpLoggerSettings 类来定制日志记录的行为:

final settings = TalkerRhttpLoggerSettings(
  // 响应日志选项
  printResponseData: true,      // 记录响应体
  printResponseHeaders: false,  // 记录响应头
  printResponseMessage: true,   // 记录响应状态信息
  
  // 请求日志选项
  printRequestData: true,       // 记录请求体
  printRequestHeaders: false,   // 记录请求头
  
  // 错误日志选项
  printErrorData: true,         // 记录错误响应体
  printErrorHeaders: true,      // 记录错误响应头
  printErrorMessage: true,      // 记录错误消息
);

final logger = TalkerRHttpLoggerInterceptor(
  talker: talker,
  settings: settings,
);

自定义颜色

通过设置不同的颜色,使你的日志更加直观:

final settings = TalkerRhttpLoggerSettings(
  // 蓝色用于请求
  requestPen: AnsiPen()..blue(),
  
  // 绿色用于成功的响应
  responsePen: AnsiPen()..green(),
  
  // 红色用于错误
  errorPen: AnsiPen()..red(),
);

选择性日志记录

你可以通过过滤函数来控制哪些请求、响应或错误会被记录:

final settings = TalkerRhttpLoggerSettings(
  // 过滤请求
  requestFilter: (request) {
    // 只记录 API 请求
    return request.url.path.startsWith('/api/');
  },
  
  // 过滤响应
  responseFilter: (response) {
    // 只记录非200状态码的响应
    return response.statusCode != 200;
  },
  
  // 过滤错误
  errorFilter: (error) {
    // 只记录超时错误
    return error.type == RhttpExceptionType.connectTimeout;
  },
);

🔒 安全最佳实践

  1. 最小化敏感数据的日志记录
final settings = TalkerRhttpLoggerSettings(
  // 禁用头和体的记录
  printRequestHeaders: false,
  printResponseHeaders: false,
  printRequestData: false,
  printResponseData: false,
);
  1. 过滤敏感端点
final settings = TalkerRhttpLoggerSettings(
  requestFilter: (request) {
    // 跳过敏感端点的日志记录
    final sensitiveEndpoints = ['/auth', '/payment', '/users'];
    return !sensitiveEndpoints.any(
      (endpoint) => request.url.path.contains(endpoint),
    );
  },
);
  1. 选择性错误日志记录
final settings = TalkerRhttpLoggerSettings(
  // 只记录错误消息,不记录完整的错误数据
  printErrorData: false,
  printErrorHeaders: false,
  printErrorMessage: true,
);

📝 完整设置参考

TalkerRhttpLoggerSettings({
  // 响应设置
  bool printResponseData = true,
  bool printResponseHeaders = false,
  bool printResponseMessage = true,
  
  // 错误设置
  bool printErrorData = true,
  bool printErrorHeaders = true,
  bool printErrorMessage = true,
  
  // 请求设置
  bool printRequestData = true,
  bool printRequestHeaders = false,
  
  // 自定义颜色
  AnsiPen? requestPen,
  AnsiPen? responsePen,
  AnsiPen? errorPen,
  
  // 自定义过滤器
  bool Function(HttpRequest request)? requestFilter,
  bool Function(HttpResponse response)? responseFilter,
  bool Function(RhttpException exception)? errorFilter,
});

示例 Demo

下面是一个完整的 Flutter 应用示例,展示了如何使用 talker_rhttp_logger 插件:

import 'package:flutter/material.dart';
import 'package:rhttp/rhttp.dart';
import 'package:talker_flutter/talker_flutter.dart';
import 'package:talker_rhttp_logger/talker_rhttp_logger.dart';

void main() async {
  await Rhttp.init();
  runApp(const MainApp());
}

class MainApp extends StatelessWidget {
  const MainApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: RhttpLoggerUi(),
    );
  }
}

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

  [@override](/user/override)
  State<RhttpLoggerUi> createState() => _RhttpLoggerUiState();
}

class _RhttpLoggerUiState extends State<RhttpLoggerUi> {
  late RhttpClient rhttpClient;
  String response = '';

  [@override](/user/override)
  void dispose() {
    rhttpClient.dispose();
    super.dispose();
  }

  [@override](/user/override)
  void initState() {
    super.initState();
    fetchComments();
  }

  Future<String> getComments() async {
    rhttpClient = await RhttpClient.create(
      settings: const ClientSettings(baseUrl: "https://httpstat.us"),
      interceptors: [
        TalkerRhttpLogger(
          talker: TalkerFlutter.init(),
          settings: const TalkerRhttpLoggerSettings(
            printRequestHeaders: true,
            printResponseHeaders: true,
            printCurlCommand: true,
          ),
        )
      ],
    );
    final response = await rhttpClient.post(
      '/302',
      body: const HttpBody.json(null),
      headers: const HttpHeaders.rawMap({
        'Accept': 'application/json',
      }),
    );
    return response.body;
  }

  Future<void> fetchComments() async {
    try {
      final result = await getComments();
      setState(() {
        response = result.isEmpty ? "No Data" : result.toString();
      });
    } catch (e) {
      setState(() {
        response = 'Error: ${e.toString()}';
      });
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Rhttp Logger UI'),
      ),
      body: Center(
        child: response.isEmpty
            ? const CircularProgressIndicator()
            : SingleChildScrollView(
                padding: const EdgeInsets.all(16),
                child: Text(response),
              ),
      ),
    );
  }
}

更多关于Flutter网络请求日志记录插件talker_rhttp_logger的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网络请求日志记录插件talker_rhttp_logger的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用talker_rhttp_logger插件来记录网络请求日志的示例代码。这个插件可以帮助你捕获并打印HTTP请求的详细信息,包括请求头、请求体、响应头和响应体等。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加talker_rhttp_logger的依赖:

dependencies:
  flutter:
    sdk: flutter
  talker_rhttp_logger: ^最新版本号  # 请替换为最新版本号

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

2. 配置dio拦截器

talker_rhttp_logger通常与dio库一起使用,因为它提供了一个拦截器来捕获HTTP请求和响应。以下是如何配置dio客户端以使用talker_rhttp_logger的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Network Logging Example'),
        ),
        body: Center(
          child: NetworkLoggingExample(),
        ),
      ),
    );
  }
}

class NetworkLoggingExample extends StatefulWidget {
  @override
  _NetworkLoggingExampleState createState() => _NetworkLoggingExampleState();
}

class _NetworkLoggingExampleState extends State<NetworkLoggingExample> {
  final Dio _dio = Dio();

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

    // 配置dio拦截器
    _dio.interceptors.add(
      LogInterceptor(
        responseBody: true, // 是否记录响应体
        requestBody: true,  // 是否记录请求体
        requestHeader: true, // 是否记录请求头
        responseHeader: true, // 是否记录响应头
        logPrint: print, // 日志输出函数,这里使用Flutter的print函数
      )
    );

    // 发起一个网络请求作为示例
    _fetchData();
  }

  Future<void> _fetchData() async {
    try {
      Response response = await _dio.get('https://jsonplaceholder.typicode.com/posts/1');
      print('Response Data: ${response.data}');
    } catch (error) {
      print('Error: $error');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Text('Check console for network logs.');
  }
}

3. 运行应用

现在你可以运行你的Flutter应用,并在控制台中看到网络请求的日志输出。

注意事项

  • 确保你正在使用的diotalker_rhttp_logger版本兼容。
  • LogInterceptorlogPrint参数允许你自定义日志输出函数,这里为了简单起见,我们使用了Flutter的print函数。
  • 你可以根据需要调整LogInterceptor的其他参数,例如是否记录请求体、响应体、请求头和响应头等。

通过以上步骤,你就可以在Flutter项目中成功使用talker_rhttp_logger插件来记录网络请求日志了。

回到顶部