| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- 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<Response<T>> get<T>(
- String path, {
- Map<String, dynamic>? queryParameters,
- Options? options,
- CancelToken? cancelToken,
- ProgressCallback? onReceiveProgress,
- }) async {
- try {
- final response = await dio.get<T>(
- 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<Response<T>> post<T>(
- String path, {
- dynamic data,
- Map<String, dynamic>? queryParameters,
- Options? options,
- CancelToken? cancelToken,
- ProgressCallback? onSendProgress,
- ProgressCallback? onReceiveProgress,
- }) async {
- try {
- final response = await dio.post<T>(
- 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<Response<T>> delete<T>(
- String path, {
- dynamic data,
- Map<String, dynamic>? queryParameters,
- Options? options,
- CancelToken? cancelToken,
- }) async {
- try {
- final response = await dio.delete<T>(
- 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<Response<T>> put<T>(
- String path, {
- dynamic data,
- Map<String, dynamic>? queryParameters,
- Options? options,
- CancelToken? cancelToken,
- ProgressCallback? onSendProgress,
- ProgressCallback? onReceiveProgress,
- }) async {
- try {
- final response = await dio.put<T>(
- 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<Response<T>> patch<T>(
- String path, {
- dynamic data,
- Map<String, dynamic>? queryParameters,
- Options? options,
- CancelToken? cancelToken,
- ProgressCallback? onSendProgress,
- ProgressCallback? onReceiveProgress,
- }) async {
- try {
- final response = await dio.patch<T>(
- path,
- data: data,
- queryParameters: queryParameters,
- options: options,
- cancelToken: cancelToken,
- onSendProgress: onSendProgress,
- onReceiveProgress: onReceiveProgress,
- );
- return response;
- } on DioException catch (e) {
- // 错误已由 ErrorInterceptor 处理,直接抛出
- rethrow;
- }
- }
- }
|