import 'package:dio/dio.dart' hide LogInterceptor; import 'package:sino_med_cloud/core/constants/api_constants.dart'; import 'package:sino_med_cloud/core/network/interceptors/auth_interceptor.dart'; import 'package:sino_med_cloud/core/network/interceptors/error_interceptor.dart'; import 'package:sino_med_cloud/core/network/interceptors/log_interceptor.dart'; import 'package:sino_med_cloud/core/utils/logger.dart'; import 'package:sino_med_cloud/base/common_response.dart'; /// Dio 客户端 - 统一网络请求管理 class DioClient { // 使用一个内部方法来创建和配置 Dio 实例 static final Dio _dio = _createDio(); static Dio _createDio() { AppLogger.d('DioClient - 开始创建 Dio 实例并配置拦截器'); final dio = Dio( BaseOptions( baseUrl: ApiConstants.baseUrl, connectTimeout: Duration(seconds: ApiConstants.connectTimeout), receiveTimeout: Duration(seconds: ApiConstants.receiveTimeout), sendTimeout: Duration(seconds: ApiConstants.sendTimeout), headers: { ApiConstants.contentType: ApiConstants.applicationJson, }, ), ); // 立即添加拦截器 dio.interceptors.addAll([ AuthInterceptor(), // 认证拦截器 LogInterceptor(), // 日志拦截器 ErrorInterceptor(), // 错误拦截器 ]); AppLogger.d('DioClient - Dio 实例初始化完成,拦截器数量: ${dio.interceptors.length}'); return dio; } // 暴露 dio 实例 static Dio get dio => _dio; /// 重置 Dio 实例(用于重新配置) static void reset() { _dio.interceptors.clear(); _dio.interceptors.addAll([ AuthInterceptor(), LogInterceptor(), ErrorInterceptor(), ]); } // ==================== GET 请求 ==================== /// GET 请求 /// /// [path] 请求路径(相对于 baseUrl) /// [fromJsonT] JSON 转换为 T 类型的函数 /// [queryParameters] 查询参数 /// [options] 请求选项 /// /// 返回 [BaseCommonResponse] 对象 static Future> get( String path, { required T Function(Object? json) fromJsonT, Map? queryParameters, Options? options, CancelToken? cancelToken, ProgressCallback? onReceiveProgress, }) async { try { final response = await dio.get( path, queryParameters: queryParameters, options: options, cancelToken: cancelToken, onReceiveProgress: onReceiveProgress, ); return BaseCommonResponse.fromJson( response.data as Map, fromJsonT, ); } on DioException catch (e) { // 错误已由 ErrorInterceptor 处理,直接抛出 rethrow; } } // ==================== POST 请求 ==================== /// POST 请求 /// /// [path] 请求路径(相对于 baseUrl) /// [fromJsonT] JSON 转换为 T 类型的函数 /// [data] 请求体数据 /// [queryParameters] 查询参数 /// [options] 请求选项 /// /// 返回 [BaseCommonResponse] 对象 static Future> post( String path, { required T Function(Object? json) fromJsonT, dynamic data, Map? queryParameters, Options? options, CancelToken? cancelToken, ProgressCallback? onSendProgress, ProgressCallback? onReceiveProgress, }) async { try { final response = await dio.post( path, data: data, queryParameters: queryParameters, options: options, cancelToken: cancelToken, onSendProgress: onSendProgress, onReceiveProgress: onReceiveProgress, ); return BaseCommonResponse.fromJson( response.data as Map, fromJsonT, ); } on DioException catch (e) { // 错误已由 ErrorInterceptor 处理,直接抛出 rethrow; } } // ==================== DELETE 请求 ==================== /// DELETE 请求 /// /// [path] 请求路径(相对于 baseUrl) /// [fromJsonT] JSON 转换为 T 类型的函数 /// [data] 请求体数据(可选) /// [queryParameters] 查询参数 /// [options] 请求选项 /// /// 返回 [BaseCommonResponse] 对象 static Future> delete( String path, { required T Function(Object? json) fromJsonT, dynamic data, Map? queryParameters, Options? options, CancelToken? cancelToken, }) async { try { final response = await dio.delete( path, data: data, queryParameters: queryParameters, options: options, cancelToken: cancelToken, ); return BaseCommonResponse.fromJson( response.data as Map, fromJsonT, ); } on DioException catch (e) { // 错误已由 ErrorInterceptor 处理,直接抛出 rethrow; } } // ==================== PUT 请求 ==================== /// PUT 请求 /// /// [path] 请求路径(相对于 baseUrl) /// [fromJsonT] JSON 转换为 T 类型的函数 /// [data] 请求体数据 /// [queryParameters] 查询参数 /// [options] 请求选项 /// /// 返回 [BaseCommonResponse] 对象 static Future> put( String path, { required T Function(Object? json) fromJsonT, dynamic data, Map? queryParameters, Options? options, CancelToken? cancelToken, ProgressCallback? onSendProgress, ProgressCallback? onReceiveProgress, }) async { try { final response = await dio.put( path, data: data, queryParameters: queryParameters, options: options, cancelToken: cancelToken, onSendProgress: onSendProgress, onReceiveProgress: onReceiveProgress, ); return BaseCommonResponse.fromJson( response.data as Map, fromJsonT, ); } on DioException catch (e) { // 错误已由 ErrorInterceptor 处理,直接抛出 rethrow; } } // ==================== PATCH 请求 ==================== /// PATCH 请求 /// /// [path] 请求路径(相对于 baseUrl) /// [fromJsonT] JSON 转换为 T 类型的函数 /// [data] 请求体数据 /// [queryParameters] 查询参数 /// [options] 请求选项 /// /// 返回 [BaseCommonResponse] 对象 static Future> patch( String path, { required T Function(Object? json) fromJsonT, dynamic data, Map? queryParameters, Options? options, CancelToken? cancelToken, ProgressCallback? onSendProgress, ProgressCallback? onReceiveProgress, }) async { try { final response = await dio.patch( path, data: data, queryParameters: queryParameters, options: options, cancelToken: cancelToken, onSendProgress: onSendProgress, onReceiveProgress: onReceiveProgress, ); return BaseCommonResponse.fromJson( response.data as Map, fromJsonT, ); } on DioException catch (e) { // 错误已由 ErrorInterceptor 处理,直接抛出 rethrow; } } }