Compare commits
No commits in common. "bdecf12949484c845e9d04153c310675bce5bb9e" and "9d6aaf64b41e6069abb5a994216983a2e2f64284" have entirely different histories.
bdecf12949
...
9d6aaf64b4
|
|
@ -1,87 +1,62 @@
|
||||||
import 'package:dio/dio.dart';
|
import 'package:dio/dio.dart';
|
||||||
import 'package:yx_net_inspector/yx_net_inspector.dart';
|
import 'package:yx_net_inspector/src/yx_net_inspector_app.dart';
|
||||||
|
|
||||||
/// YX Net Inspector Dio 拦截器
|
/// 网络检查器 Dio 拦截器
|
||||||
///
|
///
|
||||||
/// 自动记录所有通过 Dio 发送的网络请求到 YX Net Inspector
|
/// 用于自动记录 Dio 请求和响应日志到 YxNetInspector
|
||||||
///
|
|
||||||
/// 使用方式:
|
|
||||||
/// ```dart
|
|
||||||
/// // 在 App 初始化时(仅 Debug 模式)
|
|
||||||
/// if (kDebugMode) {
|
|
||||||
/// final dio = YxNetworkServiceManager.instance.mainDio;
|
|
||||||
/// dio.interceptors.add(YxNetInspectorDioInterceptor());
|
|
||||||
/// }
|
|
||||||
/// ```
|
|
||||||
class YxNetInspectorDioInterceptor extends Interceptor {
|
class YxNetInspectorDioInterceptor extends Interceptor {
|
||||||
final YxNetInspectorController _controller =
|
|
||||||
YxNetInspectorController.instance;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
|
void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
|
||||||
// 生成唯一的请求ID
|
// 记录请求
|
||||||
final requestId =
|
YxNetInspectorGlobal.logRequest(
|
||||||
'${DateTime.now().millisecondsSinceEpoch}_${options.hashCode}';
|
id: options.hashCode.toString(),
|
||||||
|
|
||||||
// 在请求选项中存储请求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,
|
method: options.method,
|
||||||
url: options.uri.toString(),
|
url: options.uri.toString(),
|
||||||
headers: options.headers.map((k, v) => MapEntry(k, v.toString())),
|
headers: options.headers,
|
||||||
requestData: options.data,
|
requestData: options.data,
|
||||||
queryParameters:
|
queryParameters: options.queryParameters,
|
||||||
options.queryParameters.isNotEmpty ? options.queryParameters : null,
|
|
||||||
);
|
);
|
||||||
|
handler.next(options);
|
||||||
super.onRequest(options, handler);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onResponse(Response response, ResponseInterceptorHandler handler) {
|
void onResponse(
|
||||||
final requestId = response.requestOptions.extra['yx_request_id'] as String?;
|
Response<dynamic> response, ResponseInterceptorHandler handler,) {
|
||||||
final startTime =
|
// 记录响应
|
||||||
response.requestOptions.extra['yx_request_start_time'] as DateTime?;
|
try {
|
||||||
|
// 计算请求耗时(如果可能)
|
||||||
|
// 注意:Dio 的 RequestOptions 不带时间戳,我们这里可能依赖 Controller 内部的计时,
|
||||||
|
// 或者我们可以扩展 RequestOptions 来携带时间戳 (extra)
|
||||||
|
final requestOptions = response.requestOptions;
|
||||||
|
|
||||||
if (requestId != null) {
|
YxNetInspectorGlobal.logResponse(
|
||||||
final duration =
|
id: requestOptions.hashCode.toString(),
|
||||||
startTime != null ? DateTime.now().difference(startTime) : null;
|
|
||||||
|
|
||||||
// 记录响应到 YX Net Inspector
|
|
||||||
_controller.logResponse(
|
|
||||||
id: requestId,
|
|
||||||
statusCode: response.statusCode,
|
statusCode: response.statusCode,
|
||||||
responseData: response.data,
|
responseData: response.data,
|
||||||
duration: duration,
|
responseHeaders: response.headers.map,
|
||||||
|
// 这里没有准确的耗时,因为 logRequest 记录了开始时间。
|
||||||
|
// Controller 会根据 ID 自动计算耗时:Duration = Now - StartTime
|
||||||
);
|
);
|
||||||
|
} on Object catch (_) {
|
||||||
|
// 忽略日志记录错误,避免影响业务
|
||||||
}
|
}
|
||||||
|
handler.next(response);
|
||||||
super.onResponse(response, handler);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onError(DioException err, ErrorInterceptorHandler handler) {
|
void onError(DioException err, ErrorInterceptorHandler handler) {
|
||||||
final requestId = err.requestOptions.extra['yx_request_id'] as String?;
|
// 记录错误
|
||||||
final startTime =
|
try {
|
||||||
err.requestOptions.extra['yx_request_start_time'] as DateTime?;
|
final requestOptions = err.requestOptions;
|
||||||
|
|
||||||
if (requestId != null) {
|
YxNetInspectorGlobal.logError(
|
||||||
final duration =
|
id: requestOptions.hashCode.toString(),
|
||||||
startTime != null ? DateTime.now().difference(startTime) : null;
|
error: err.message ?? err.toString(),
|
||||||
|
|
||||||
// 记录错误到 YX Net Inspector
|
|
||||||
_controller.logError(
|
|
||||||
id: requestId,
|
|
||||||
error: err.message ?? '未知网络错误',
|
|
||||||
statusCode: err.response?.statusCode,
|
statusCode: err.response?.statusCode,
|
||||||
duration: duration,
|
|
||||||
);
|
);
|
||||||
|
} on Object catch (_) {
|
||||||
|
// 忽略日志记录错误
|
||||||
}
|
}
|
||||||
|
handler.next(err);
|
||||||
super.onError(err, handler);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue