首次提交

This commit is contained in:
qmqz
2025-01-02 10:08:03 +08:00
commit fd62ed3d98
16 changed files with 1143 additions and 0 deletions

119
lib/base/http/TraceDio.dart Normal file
View File

@@ -0,0 +1,119 @@
import 'package:EasyDartModule/base/logger/Logger.dart';
import 'package:dio/dio.dart';
import 'package:shelf/shelf.dart' as sf;
class TraceDio {
final Dio _dio;
final Logger _logger;
static late TraceDio _traceDio;
TraceDio(Logger logger)
: _dio = Dio(),
_logger = logger {
// 配置 Dio
// 设置连接超时
_dio.options.connectTimeout = Duration(seconds: 5);
// 设置接收超时
_dio.options.receiveTimeout = Duration(seconds: 5);
//保留原始大小写
_dio.options.preserveHeaderCase = true;
// 设置拦截器,自动添加 traceId 和 spanId并记录日志
String traceId = "none";
String spanId = "none";
_dio.interceptors.add(InterceptorsWrapper(
onRequest: (options, handler) {
// 获取请求中的 traceId如果没有则生成
traceId = options.headers['X-Trace-ID'];
spanId = options.headers['X-Span-ID'];
// 在请求头中添加 traceId 和 spanId
// options.headers['X-Trace-ID'] = traceId;
// options.headers['X-Span-ID'] = spanId;
// 记录请求日志
_logger.info(
'traceId=$traceId, spanId=$spanId Sending request: ${options.method} ${options.uri}',
tag: "DIO");
return handler.next(options); // 继续请求
},
onResponse: (response, handler) {
// 记录响应日志
_logger.info(
'traceId=$traceId, spanId=$spanId Response received: ${response.statusCode} ${response.statusMessage}',
tag: "DIO");
return handler.next(response); // 继续处理响应
},
onError: (DioException e, handler) {
// 记录错误日志
_logger.error(
'traceId=$traceId, spanId=$spanId Request failed: ${e.message}',
tag: "DIO");
return handler.next(e); // 继续处理错误
},
));
}
static TraceDio getInstance() {
return _traceDio;
}
static void setInstance(TraceDio traceDio) {
_traceDio = traceDio;
}
Map<String, dynamic>? getHeader(
{Map<String, dynamic>? headers, sf.Request? request}) {
if (request != null) {
return {
"X-Trace-ID": request.context['request_trace_id'] as String,
"X-Span-ID": request.context['request_span_id'] as String
};
}
return null;
}
// 发起 GET 请求
Future<Response> get(String url,
{Map<String, dynamic>? queryParameters, sf.Request? request}) async {
return await _dio.get(url,
queryParameters: queryParameters,
options: Options(headers: getHeader(request: request)));
}
// 发起 POST 请求
Future<Response> post(String url,
{Object? data,
Map<String, dynamic>? queryParameters,
sf.Request? request}) async {
return await _dio.post(url,
data: data,
queryParameters: queryParameters,
options: Options(headers: getHeader(request: request)));
}
// 发起 PUT 请求
Future<Response> put(String url,
{Object? data,
Map<String, dynamic>? queryParameters,
sf.Request? request}) async {
return await _dio.put(url,
data: data,
queryParameters: queryParameters,
options: Options(headers: getHeader(request: request)));
}
// 发起 DELETE 请求
Future<Response> delete(String url,
{Object? data,
Map<String, dynamic>? queryParameters,
sf.Request? request}) async {
return await _dio.delete(
url,
data: data,
queryParameters: queryParameters,
options: Options(headers: getHeader(request: request)),
);
}
}