dio_client.dart 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. import 'package:dio/dio.dart' hide LogInterceptor;
  2. import 'package:sino_med_cloud/core/constants/api_constants.dart';
  3. import 'package:sino_med_cloud/core/network/interceptors/auth_interceptor.dart';
  4. import 'package:sino_med_cloud/core/network/interceptors/error_interceptor.dart';
  5. import 'package:sino_med_cloud/core/network/interceptors/log_interceptor.dart';
  6. import 'package:sino_med_cloud/core/utils/logger.dart';
  7. /// Dio 客户端 - 统一网络请求管理
  8. class DioClient {
  9. // 使用一个内部方法来创建和配置 Dio 实例
  10. static final Dio _dio = _createDio();
  11. static Dio _createDio() {
  12. AppLogger.d('DioClient - 开始创建 Dio 实例并配置拦截器');
  13. final dio = Dio(
  14. BaseOptions(
  15. baseUrl: ApiConstants.baseUrl,
  16. connectTimeout: Duration(seconds: ApiConstants.connectTimeout),
  17. receiveTimeout: Duration(seconds: ApiConstants.receiveTimeout),
  18. sendTimeout: Duration(seconds: ApiConstants.sendTimeout),
  19. headers: {
  20. ApiConstants.contentType: ApiConstants.applicationJson,
  21. },
  22. ),
  23. );
  24. // 立即添加拦截器
  25. dio.interceptors.addAll([
  26. AuthInterceptor(), // 认证拦截器
  27. LogInterceptor(), // 日志拦截器
  28. ErrorInterceptor(), // 错误拦截器
  29. ]);
  30. AppLogger.d('DioClient - Dio 实例初始化完成,拦截器数量: ${dio.interceptors.length}');
  31. return dio;
  32. }
  33. // 暴露 dio 实例
  34. static Dio get dio => _dio;
  35. /// 重置 Dio 实例(用于重新配置)
  36. static void reset() {
  37. _dio.interceptors.clear();
  38. _dio.interceptors.addAll([
  39. AuthInterceptor(),
  40. LogInterceptor(),
  41. ErrorInterceptor(),
  42. ]);
  43. }
  44. // ==================== GET 请求 ====================
  45. /// GET 请求
  46. ///
  47. /// [path] 请求路径(相对于 baseUrl)
  48. /// [queryParameters] 查询参数
  49. /// [options] 请求选项
  50. ///
  51. /// 返回 [Response] 对象
  52. static Future<Response<T>> get<T>(
  53. String path, {
  54. Map<String, dynamic>? queryParameters,
  55. Options? options,
  56. CancelToken? cancelToken,
  57. ProgressCallback? onReceiveProgress,
  58. }) async {
  59. try {
  60. final response = await dio.get<T>(
  61. path,
  62. queryParameters: queryParameters,
  63. options: options,
  64. cancelToken: cancelToken,
  65. onReceiveProgress: onReceiveProgress,
  66. );
  67. return response;
  68. } on DioException catch (e) {
  69. // 错误已由 ErrorInterceptor 处理,直接抛出
  70. rethrow;
  71. }
  72. }
  73. // ==================== POST 请求 ====================
  74. /// POST 请求
  75. ///
  76. /// [path] 请求路径(相对于 baseUrl)
  77. /// [data] 请求体数据
  78. /// [queryParameters] 查询参数
  79. /// [options] 请求选项
  80. ///
  81. /// 返回 [Response] 对象
  82. static Future<Response<T>> post<T>(
  83. String path, {
  84. dynamic data,
  85. Map<String, dynamic>? queryParameters,
  86. Options? options,
  87. CancelToken? cancelToken,
  88. ProgressCallback? onSendProgress,
  89. ProgressCallback? onReceiveProgress,
  90. }) async {
  91. try {
  92. final response = await dio.post<T>(
  93. path,
  94. data: data,
  95. queryParameters: queryParameters,
  96. options: options,
  97. cancelToken: cancelToken,
  98. onSendProgress: onSendProgress,
  99. onReceiveProgress: onReceiveProgress,
  100. );
  101. return response;
  102. } on DioException catch (e) {
  103. // 错误已由 ErrorInterceptor 处理,直接抛出
  104. rethrow;
  105. }
  106. }
  107. // ==================== DELETE 请求 ====================
  108. /// DELETE 请求
  109. ///
  110. /// [path] 请求路径(相对于 baseUrl)
  111. /// [data] 请求体数据(可选)
  112. /// [queryParameters] 查询参数
  113. /// [options] 请求选项
  114. ///
  115. /// 返回 [Response] 对象
  116. static Future<Response<T>> delete<T>(
  117. String path, {
  118. dynamic data,
  119. Map<String, dynamic>? queryParameters,
  120. Options? options,
  121. CancelToken? cancelToken,
  122. }) async {
  123. try {
  124. final response = await dio.delete<T>(
  125. path,
  126. data: data,
  127. queryParameters: queryParameters,
  128. options: options,
  129. cancelToken: cancelToken,
  130. );
  131. return response;
  132. } on DioException catch (e) {
  133. // 错误已由 ErrorInterceptor 处理,直接抛出
  134. rethrow;
  135. }
  136. }
  137. // ==================== PUT 请求====================
  138. /// PUT 请求
  139. ///
  140. /// [path] 请求路径(相对于 baseUrl)
  141. /// [data] 请求体数据
  142. /// [queryParameters] 查询参数
  143. /// [options] 请求选项
  144. ///
  145. /// 返回 [Response] 对象
  146. static Future<Response<T>> put<T>(
  147. String path, {
  148. dynamic data,
  149. Map<String, dynamic>? queryParameters,
  150. Options? options,
  151. CancelToken? cancelToken,
  152. ProgressCallback? onSendProgress,
  153. ProgressCallback? onReceiveProgress,
  154. }) async {
  155. try {
  156. final response = await dio.put<T>(
  157. path,
  158. data: data,
  159. queryParameters: queryParameters,
  160. options: options,
  161. cancelToken: cancelToken,
  162. onSendProgress: onSendProgress,
  163. onReceiveProgress: onReceiveProgress,
  164. );
  165. return response;
  166. } on DioException catch (e) {
  167. // 错误已由 ErrorInterceptor 处理,直接抛出
  168. rethrow;
  169. }
  170. }
  171. // ==================== PATCH 请求 ====================
  172. /// PATCH 请求
  173. ///
  174. /// [path] 请求路径(相对于 baseUrl)
  175. /// [data] 请求体数据
  176. /// [queryParameters] 查询参数
  177. /// [options] 请求选项
  178. ///
  179. /// 返回 [Response] 对象
  180. static Future<Response<T>> patch<T>(
  181. String path, {
  182. dynamic data,
  183. Map<String, dynamic>? queryParameters,
  184. Options? options,
  185. CancelToken? cancelToken,
  186. ProgressCallback? onSendProgress,
  187. ProgressCallback? onReceiveProgress,
  188. }) async {
  189. try {
  190. final response = await dio.patch<T>(
  191. path,
  192. data: data,
  193. queryParameters: queryParameters,
  194. options: options,
  195. cancelToken: cancelToken,
  196. onSendProgress: onSendProgress,
  197. onReceiveProgress: onReceiveProgress,
  198. );
  199. return response;
  200. } on DioException catch (e) {
  201. // 错误已由 ErrorInterceptor 处理,直接抛出
  202. rethrow;
  203. }
  204. }
  205. }