Merge branch 'release/1.1.1'
This commit is contained in:
commit
bdecf12949
|
|
@ -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<dynamic> 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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue