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'; /// Dio 客户端 - 统一网络请求管理 class DioClient { static final Dio _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, }, ), ); static Dio get dio { // 确保拦截器只添加一次 // 拦截器执行顺序:按添加顺序执行 // 1. AuthInterceptor - 在请求前添加 Token // 2. LogInterceptor - 记录请求和响应日志 // 3. ErrorInterceptor - 统一处理错误 if (_dio.interceptors.isEmpty) { _dio.interceptors.addAll([ AuthInterceptor(), // 认证拦截器(自动添加 Token) LogInterceptor(), // 日志拦截器(使用 AppLogger 记录日志) ErrorInterceptor(), // 错误拦截器(统一错误处理) ]); // 调试:确认拦截器已添加 assert(_dio.interceptors.length == 3, '拦截器应该添加3个'); } return _dio; } /// 重置 Dio 实例(用于重新配置) static void reset() { _dio.interceptors.clear(); } // ==================== GET 请求 ==================== /// GET 请求 /// /// [path] 请求路径(相对于 baseUrl) /// [queryParameters] 查询参数 /// [options] 请求选项 /// /// 返回 [Response] 对象 static Future> get( String path, { 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 response; } on DioException catch (e) { // 错误已由 ErrorInterceptor 处理,直接抛出 rethrow; } } // ==================== POST 请求 ==================== /// POST 请求 /// /// [path] 请求路径(相对于 baseUrl) /// [data] 请求体数据 /// [queryParameters] 查询参数 /// [options] 请求选项 /// /// 返回 [Response] 对象 static Future> post( String path, { 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 response; } on DioException catch (e) { // 错误已由 ErrorInterceptor 处理,直接抛出 rethrow; } } // ==================== DELETE 请求 ==================== /// DELETE 请求 /// /// [path] 请求路径(相对于 baseUrl) /// [data] 请求体数据(可选) /// [queryParameters] 查询参数 /// [options] 请求选项 /// /// 返回 [Response] 对象 static Future> delete( String path, { 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 response; } on DioException catch (e) { // 错误已由 ErrorInterceptor 处理,直接抛出 rethrow; } } // ==================== PUT 请求==================== /// PUT 请求 /// /// [path] 请求路径(相对于 baseUrl) /// [data] 请求体数据 /// [queryParameters] 查询参数 /// [options] 请求选项 /// /// 返回 [Response] 对象 static Future> put( String path, { 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 response; } on DioException catch (e) { // 错误已由 ErrorInterceptor 处理,直接抛出 rethrow; } } // ==================== PATCH 请求 ==================== /// PATCH 请求 /// /// [path] 请求路径(相对于 baseUrl) /// [data] 请求体数据 /// [queryParameters] 查询参数 /// [options] 请求选项 /// /// 返回 [Response] 对象 static Future> patch( String path, { 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 response; } on DioException catch (e) { // 错误已由 ErrorInterceptor 处理,直接抛出 rethrow; } } }