http.dart 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. import 'dart:io';
  2. import 'package:dio/dio.dart';
  3. import 'package:fast/utils/global.dart';
  4. import 'package:flutter/foundation.dart';
  5. class Http {
  6. static final Http _instance = Http._internal();
  7. // 单例模式使用Http类,
  8. factory Http() => _instance;
  9. static late final Dio dio;
  10. final CancelToken _cancelToken = CancelToken();
  11. Http._internal() {
  12. // BaseOptions、Options、RequestOptions 都可以配置参数,优先级别依次递增,且可以根据优先级别覆盖参数
  13. BaseOptions options = BaseOptions();
  14. dio = Dio(options);
  15. // // 添加request拦截器
  16. // dio.interceptors.add(RequestInterceptor());
  17. // // 添加error拦截器
  18. dio.interceptors.add(ErrorInterceptor());
  19. // // // 添加cache拦截器
  20. // dio.interceptors.add(NetCacheInterceptor());
  21. // // // 添加retry拦截器
  22. // dio.interceptors.add(
  23. // RetryOnConnectionChangeInterceptor(
  24. // requestRetrier: DioConnectivityRequestRetrier(
  25. // dio: dio,
  26. // connectivity: Connectivity(),
  27. // ),
  28. // ),
  29. // );
  30. // 在调试模式下需要抓包调试,所以我们使用代理,并禁用HTTPS证书校验
  31. // if (PROXY_ENABLE) {
  32. // (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
  33. // (client) {
  34. // client.findProxy = (uri) {
  35. // return "PROXY $PROXY_IP:$PROXY_PORT";
  36. // };
  37. // //代理工具会提供一个抓包的自签名证书,会通不过证书校验,所以我们禁用证书校验
  38. // client.badCertificateCallback =
  39. // (X509Certificate cert, String host, int port) => true;
  40. // };
  41. // }
  42. }
  43. ///初始化公共属性
  44. ///
  45. /// [baseUrl] 地址前缀
  46. /// [connectTimeout] 连接超时赶时间
  47. /// [receiveTimeout] 接收超时赶时间
  48. /// [interceptors] 基础拦截器
  49. void init({
  50. String? baseUrl,
  51. int connectTimeout = 1500,
  52. int receiveTimeout = 1500,
  53. Map<String, String>? headers,
  54. List<Interceptor>? interceptors,
  55. }) {
  56. dio.options = dio.options.copyWith(
  57. baseUrl: baseUrl,
  58. connectTimeout: connectTimeout,
  59. receiveTimeout: receiveTimeout,
  60. headers: headers ?? const {},
  61. );
  62. // 在初始化http类的时候,可以传入拦截器
  63. if (interceptors != null && interceptors.isNotEmpty) {
  64. dio.interceptors.addAll(interceptors);
  65. }
  66. }
  67. // 关闭dio
  68. void cancelRequests({required CancelToken token}) {
  69. _cancelToken.cancel("cancelled");
  70. }
  71. // 添加认证
  72. // 读取本地配置
  73. Map<String, dynamic>? getAuthorizationHeader() {
  74. Map<String, dynamic> headers = {
  75. 'X-Client-Type':kIsWeb?"WEB":Platform.isAndroid ? "ANDROID" : "IOS",
  76. 'X-Client-Version':'1.0',
  77. 'X-App-Version':'1.0'
  78. };
  79. // 从getx或者sputils中获取
  80. // String accessToken = Global.accessToken;
  81. String accessToken = Global().token;
  82. if (accessToken != null) {
  83. // headers = {
  84. // 'Authorization': 'Bearer $accessToken',
  85. // };
  86. headers['Authorization']='Bearer $accessToken';
  87. }
  88. return headers;
  89. }
  90. Future get(
  91. String path, {
  92. Map<String, dynamic>? params,
  93. Options? options,
  94. CancelToken? cancelToken,
  95. bool refresh = false,
  96. bool noCache = true,
  97. String? cacheKey,
  98. bool cacheDisk = false,
  99. }) async {
  100. Options requestOptions = options ?? Options();
  101. requestOptions = requestOptions.copyWith(
  102. extra: {
  103. "refresh": refresh,
  104. "noCache": noCache,
  105. "cacheKey": cacheKey,
  106. "cacheDisk": cacheDisk,
  107. },
  108. );
  109. Map<String, dynamic>? _authorization = getAuthorizationHeader();
  110. if (_authorization != null) {
  111. requestOptions = requestOptions.copyWith(headers: _authorization);
  112. }
  113. // try {
  114. Response response;
  115. response = await dio.get(
  116. path,
  117. queryParameters: params,
  118. options: requestOptions,
  119. cancelToken: cancelToken ?? _cancelToken,
  120. );
  121. return response.data;
  122. // } on DioError catch (e) {
  123. // if (e.response)
  124. // // return e.response!.data;
  125. // }
  126. }
  127. Future post(
  128. String path, {
  129. Map<String, dynamic>? params,
  130. data,
  131. Options? options,
  132. CancelToken? cancelToken,
  133. }) async {
  134. Options requestOptions = options ?? Options();
  135. Map<String, dynamic>? _authorization = getAuthorizationHeader();
  136. if (_authorization != null) {
  137. requestOptions = requestOptions.copyWith(headers: _authorization);
  138. }
  139. var response = await dio.post(
  140. path,
  141. data: data,
  142. queryParameters: params,
  143. options: requestOptions,
  144. cancelToken: cancelToken ?? _cancelToken,
  145. );
  146. return response.data;
  147. }
  148. Future put(
  149. String path, {
  150. data,
  151. Map<String, dynamic>? params,
  152. Options? options,
  153. CancelToken? cancelToken,
  154. }) async {
  155. Options requestOptions = options ?? Options();
  156. Map<String, dynamic>? _authorization = getAuthorizationHeader();
  157. if (_authorization != null) {
  158. requestOptions = requestOptions.copyWith(headers: _authorization);
  159. }
  160. var response = await dio.put(
  161. path,
  162. data: data,
  163. queryParameters: params,
  164. options: requestOptions,
  165. cancelToken: cancelToken ?? _cancelToken,
  166. );
  167. return response.data;
  168. }
  169. Future patch(
  170. String path, {
  171. data,
  172. Map<String, dynamic>? params,
  173. Options? options,
  174. CancelToken? cancelToken,
  175. }) async {
  176. Options requestOptions = options ?? Options();
  177. Map<String, dynamic>? _authorization = getAuthorizationHeader();
  178. if (_authorization != null) {
  179. requestOptions = requestOptions.copyWith(headers: _authorization);
  180. }
  181. var response = await dio.patch(
  182. path,
  183. data: data,
  184. queryParameters: params,
  185. options: requestOptions,
  186. cancelToken: cancelToken ?? _cancelToken,
  187. );
  188. return response.data;
  189. }
  190. Future delete(
  191. String path, {
  192. data,
  193. Map<String, dynamic>? params,
  194. Options? options,
  195. CancelToken? cancelToken,
  196. }) async {
  197. Options requestOptions = options ?? Options();
  198. Map<String, dynamic>? _authorization = getAuthorizationHeader();
  199. if (_authorization != null) {
  200. requestOptions = requestOptions.copyWith(headers: _authorization);
  201. }
  202. var response = await dio.delete(
  203. path,
  204. data: data,
  205. queryParameters: params,
  206. options: requestOptions,
  207. cancelToken: cancelToken ?? _cancelToken,
  208. );
  209. return response.data;
  210. }
  211. }
  212. class ErrorInterceptor extends Interceptor {
  213. @override
  214. void onError(DioError err, ErrorInterceptorHandler handler) {
  215. if (err.response!.statusCode == 401) {
  216. print('9527');
  217. if (Global().showLogin){
  218. return;
  219. }
  220. Global().mainPage.logout();
  221. Global().showLogin = true;
  222. return;
  223. }
  224. // if (err.response!.statusCode == 500) {
  225. // print('9527');
  226. // return;
  227. // }
  228. if (err.response!.statusCode == 422) {
  229. print('9527逆龄石不足');
  230. return;
  231. }
  232. // if (err.response!.statusCode != 200) {
  233. // // ignore: void_checks
  234. // return err.response!.data;
  235. // }
  236. super.onError(err, handler);
  237. }
  238. @override
  239. void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
  240. // TODO: implement onRequest
  241. super.onRequest(options, handler);
  242. }
  243. @override
  244. void onResponse(Response response, ResponseInterceptorHandler handler) {
  245. // TODO: implement onResponse
  246. super.onResponse(response, handler);
  247. }
  248. }