Merge branch 'release/1.1.1'
This commit is contained in:
commit
bdecf12949
|
|
@ -1,62 +1,87 @@
|
||||||
import 'package:dio/dio.dart';
|
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 {
|
class YxNetInspectorDioInterceptor extends Interceptor {
|
||||||
|
final YxNetInspectorController _controller =
|
||||||
|
YxNetInspectorController.instance;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
|
void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
|
||||||
// 记录请求
|
// 生成唯一的请求ID
|
||||||
YxNetInspectorGlobal.logRequest(
|
final requestId =
|
||||||
id: options.hashCode.toString(),
|
'${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,
|
method: options.method,
|
||||||
url: options.uri.toString(),
|
url: options.uri.toString(),
|
||||||
headers: options.headers,
|
headers: options.headers.map((k, v) => MapEntry(k, v.toString())),
|
||||||
requestData: options.data,
|
requestData: options.data,
|
||||||
queryParameters: options.queryParameters,
|
queryParameters:
|
||||||
|
options.queryParameters.isNotEmpty ? options.queryParameters : null,
|
||||||
);
|
);
|
||||||
handler.next(options);
|
|
||||||
|
super.onRequest(options, handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onResponse(
|
void onResponse(Response response, ResponseInterceptorHandler handler) {
|
||||||
Response<dynamic> response, ResponseInterceptorHandler handler,) {
|
final requestId = response.requestOptions.extra['yx_request_id'] as String?;
|
||||||
// 记录响应
|
final startTime =
|
||||||
try {
|
response.requestOptions.extra['yx_request_start_time'] as DateTime?;
|
||||||
// 计算请求耗时(如果可能)
|
|
||||||
// 注意:Dio 的 RequestOptions 不带时间戳,我们这里可能依赖 Controller 内部的计时,
|
|
||||||
// 或者我们可以扩展 RequestOptions 来携带时间戳 (extra)
|
|
||||||
final requestOptions = response.requestOptions;
|
|
||||||
|
|
||||||
YxNetInspectorGlobal.logResponse(
|
if (requestId != null) {
|
||||||
id: requestOptions.hashCode.toString(),
|
final duration =
|
||||||
|
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,
|
||||||
responseHeaders: response.headers.map,
|
duration: duration,
|
||||||
// 这里没有准确的耗时,因为 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?;
|
||||||
try {
|
final startTime =
|
||||||
final requestOptions = err.requestOptions;
|
err.requestOptions.extra['yx_request_start_time'] as DateTime?;
|
||||||
|
|
||||||
YxNetInspectorGlobal.logError(
|
if (requestId != null) {
|
||||||
id: requestOptions.hashCode.toString(),
|
final duration =
|
||||||
error: err.message ?? err.toString(),
|
startTime != null ? DateTime.now().difference(startTime) : null;
|
||||||
|
|
||||||
|
// 记录错误到 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