From 5188469b1357564ac4ad179f3b8d5230b3b97d35 Mon Sep 17 00:00:00 2001 From: YuanXuan Date: Tue, 20 Jan 2026 17:10:52 +0800 Subject: [PATCH] feat: update --- lib/src/interceptors/dio_interceptor.dart | 93 ++++++++++++++--------- 1 file changed, 59 insertions(+), 34 deletions(-) diff --git a/lib/src/interceptors/dio_interceptor.dart b/lib/src/interceptors/dio_interceptor.dart index f851754..b1fb820 100644 --- a/lib/src/interceptors/dio_interceptor.dart +++ b/lib/src/interceptors/dio_interceptor.dart @@ -1,62 +1,87 @@ import 'package:dio/dio.dart'; -import 'package:yx_net_inspector/src/yx_net_inspector_app.dart'; +import 'package:yx_net_inspector/yx_net_inspector.dart'; -/// 网络检查器 Dio 拦截器 +/// YX Net Inspector Dio 拦截器 /// -/// 用于自动记录 Dio 请求和响应日志到 YxNetInspector +/// 自动记录所有通过 Dio 发送的网络请求到 YX Net Inspector +/// +/// 使用方式: +/// ```dart +/// // 在 App 初始化时(仅 Debug 模式) +/// if (kDebugMode) { +/// final dio = YxNetworkServiceManager.instance.mainDio; +/// dio.interceptors.add(YxNetInspectorDioInterceptor()); +/// } +/// ``` class YxNetInspectorDioInterceptor extends Interceptor { + final YxNetInspectorController _controller = + YxNetInspectorController.instance; + @override void onRequest(RequestOptions options, RequestInterceptorHandler handler) { - // 记录请求 - YxNetInspectorGlobal.logRequest( - id: options.hashCode.toString(), + // 生成唯一的请求ID + final requestId = + '${DateTime.now().millisecondsSinceEpoch}_${options.hashCode}'; + + // 在请求选项中存储请求ID和开始时间 + options.extra['yx_request_id'] = requestId; + options.extra['yx_request_start_time'] = DateTime.now(); + + // 记录请求到 YX Net Inspector + _controller.logRequest( + id: requestId, method: options.method, url: options.uri.toString(), - headers: options.headers, + headers: options.headers.map((k, v) => MapEntry(k, v.toString())), requestData: options.data, - queryParameters: options.queryParameters, + queryParameters: + options.queryParameters.isNotEmpty ? options.queryParameters : null, ); - handler.next(options); + + super.onRequest(options, handler); } @override - void onResponse( - Response response, ResponseInterceptorHandler handler,) { - // 记录响应 - try { - // 计算请求耗时(如果可能) - // 注意:Dio 的 RequestOptions 不带时间戳,我们这里可能依赖 Controller 内部的计时, - // 或者我们可以扩展 RequestOptions 来携带时间戳 (extra) - final requestOptions = response.requestOptions; + void onResponse(Response response, ResponseInterceptorHandler handler) { + final requestId = response.requestOptions.extra['yx_request_id'] as String?; + final startTime = + response.requestOptions.extra['yx_request_start_time'] as DateTime?; - YxNetInspectorGlobal.logResponse( - id: requestOptions.hashCode.toString(), + if (requestId != null) { + final duration = + startTime != null ? DateTime.now().difference(startTime) : null; + + // 记录响应到 YX Net Inspector + _controller.logResponse( + id: requestId, statusCode: response.statusCode, responseData: response.data, - responseHeaders: response.headers.map, - // 这里没有准确的耗时,因为 logRequest 记录了开始时间。 - // Controller 会根据 ID 自动计算耗时:Duration = Now - StartTime + duration: duration, ); - } on Object catch (_) { - // 忽略日志记录错误,避免影响业务 } - handler.next(response); + + super.onResponse(response, handler); } @override void onError(DioException err, ErrorInterceptorHandler handler) { - // 记录错误 - try { - final requestOptions = err.requestOptions; + final requestId = err.requestOptions.extra['yx_request_id'] as String?; + final startTime = + err.requestOptions.extra['yx_request_start_time'] as DateTime?; - YxNetInspectorGlobal.logError( - id: requestOptions.hashCode.toString(), - error: err.message ?? err.toString(), + if (requestId != null) { + final duration = + startTime != null ? DateTime.now().difference(startTime) : null; + + // 记录错误到 YX Net Inspector + _controller.logError( + id: requestId, + error: err.message ?? '未知网络错误', statusCode: err.response?.statusCode, + duration: duration, ); - } on Object catch (_) { - // 忽略日志记录错误 } - handler.next(err); + + super.onError(err, handler); } }