http.dart 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. import 'dart:io';
  2. import 'package:dio/dio.dart';
  3. import 'package:flutter/foundation.dart';
  4. import 'global.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, //引起报错 Future already completed
  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. 'Access-Control-Allow-Origin':'*'
  79. };
  80. // headers['Authorization'] = 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJhY2NvdW50Iiwic3ViIjoidGVzdCIsImlzcyI6IkNPREVQQUFTLkNPTSIsIm5pY2tuYW1lIjoidGVzdCIsInR5cCI6IkJlYXJlciIsInNlc3Npb25fc3RhdGUiOiIzMjJhMzRkNzlkZWQxN2E4ZWMyYmJlNWVlZmJhNjQ4NyIsImV4cCI6MTY5MTU5NTMxOSwiaWF0IjoxNjYwMDU5MzE5fQ.A0Z3m_2WAj4DOJLdu42jXnUeX0X3T0-HkdU4BNtJ_8k';
  81. // 从getx或者sputils中获取
  82. // String accessToken = Global.accessToken;
  83. String accessToken = Global().token;
  84. if (accessToken.isNotEmpty) {
  85. headers['Authorization']='Bearer $accessToken';
  86. }
  87. else {
  88. headers['Authorization'] = 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJhY2NvdW50Iiwic3ViIjoiNzUyOTA4NDhiODNkYjNlOTQ5ZmEwMzBiYTU0OTliNjgiLCJpc3MiOiJDT0RFUEFBUy5DT00iLCJuaWNrbmFtZSI6IueDrSIsInR5cCI6IkJlYXJlciIsInNlc3Npb25fc3RhdGUiOiI0MGU2ODZlMjg1ZGQ5OTdkNjlkNWNjOGVkMWZmZGE5NCIsImV4cCI6MTY5MzU1NTI4OSwiaWF0IjoxNjYyMDE5MjkwfQ.xcTj1OUiwAlMG7KAr9QG9obxZi1d2Vi8rCeJPT_Mmtc';
  89. }
  90. return headers;
  91. }
  92. Future get(
  93. String path, {
  94. Map<String, dynamic>? params,
  95. Options? options,
  96. CancelToken? cancelToken,
  97. bool refresh = false,
  98. bool noCache = true,
  99. String? cacheKey,
  100. bool cacheDisk = false,
  101. }) async {
  102. Options requestOptions = options ?? Options();
  103. requestOptions = requestOptions.copyWith(
  104. extra: {
  105. "refresh": refresh,
  106. "noCache": noCache,
  107. "cacheKey": cacheKey,
  108. "cacheDisk": cacheDisk,
  109. },
  110. );
  111. Map<String, dynamic>? _authorization = getAuthorizationHeader();
  112. if (_authorization != null) {
  113. requestOptions = requestOptions.copyWith(headers: _authorization);
  114. }
  115. // try {
  116. Response response;
  117. response = await dio.get(
  118. path,
  119. queryParameters: params,
  120. options: requestOptions,
  121. cancelToken: cancelToken ?? _cancelToken,
  122. );
  123. return response.data;
  124. // } on DioError catch (e) {
  125. // if (e.response)
  126. // // return e.response!.data;
  127. // }
  128. }
  129. Future post(
  130. String path, {
  131. Map<String, dynamic>? params,
  132. data,
  133. Options? options,
  134. CancelToken? cancelToken,
  135. }) async {
  136. Options requestOptions = options ?? Options();
  137. Map<String, dynamic>? _authorization = getAuthorizationHeader();
  138. if (_authorization != null) {
  139. requestOptions = requestOptions.copyWith(headers: _authorization);
  140. }
  141. var response = await dio.post(
  142. path,
  143. data: data,
  144. queryParameters: params,
  145. options: requestOptions,
  146. cancelToken: cancelToken ?? _cancelToken,
  147. );
  148. if (response.data is String){
  149. return Map<String, dynamic>();
  150. }
  151. return response.data;
  152. }
  153. Future put(
  154. String path, {
  155. data,
  156. Map<String, dynamic>? params,
  157. Options? options,
  158. CancelToken? cancelToken,
  159. }) async {
  160. Options requestOptions = options ?? Options();
  161. Map<String, dynamic>? _authorization = getAuthorizationHeader();
  162. if (_authorization != null) {
  163. requestOptions = requestOptions.copyWith(headers: _authorization);
  164. }
  165. var response = await dio.put(
  166. path,
  167. data: data,
  168. queryParameters: params,
  169. options: requestOptions,
  170. cancelToken: cancelToken ?? _cancelToken,
  171. );
  172. return response.data;
  173. }
  174. Future patch(
  175. String path, {
  176. data,
  177. Map<String, dynamic>? params,
  178. Options? options,
  179. CancelToken? cancelToken,
  180. }) async {
  181. Options requestOptions = options ?? Options();
  182. Map<String, dynamic>? _authorization = getAuthorizationHeader();
  183. if (_authorization != null) {
  184. requestOptions = requestOptions.copyWith(headers: _authorization);
  185. }
  186. var response = await dio.patch(
  187. path,
  188. data: data,
  189. queryParameters: params,
  190. options: requestOptions,
  191. cancelToken: cancelToken ?? _cancelToken,
  192. );
  193. return response.data;
  194. }
  195. Future delete(
  196. String path, {
  197. data,
  198. Map<String, dynamic>? params,
  199. Options? options,
  200. CancelToken? cancelToken,
  201. }) async {
  202. Options requestOptions = options ?? Options();
  203. Map<String, dynamic>? _authorization = getAuthorizationHeader();
  204. if (_authorization != null) {
  205. requestOptions = requestOptions.copyWith(headers: _authorization);
  206. }
  207. var response = await dio.delete(
  208. path,
  209. data: data,
  210. queryParameters: params,
  211. options: requestOptions,
  212. cancelToken: cancelToken ?? _cancelToken,
  213. );
  214. return response.data;
  215. }
  216. }
  217. class ErrorInterceptor extends Interceptor {
  218. @override
  219. void onError(DioError err, ErrorInterceptorHandler handler) {
  220. if (err.response!.statusCode == 401) {
  221. // print('9527');
  222. // if (Global().showLogin){
  223. // return;
  224. // }
  225. // Global().mainPage.logout();
  226. // Global().showLogin = true;
  227. return;
  228. }
  229. // if (err.response!.statusCode == 500) {
  230. // print('9527');
  231. // return;
  232. // }
  233. // if (err.response!.statusCode == 422) {
  234. // // print('9527逆龄石不足');
  235. // return;
  236. // }
  237. // if (err.response!.statusCode != 200) {
  238. // // ignore: void_checks
  239. // return err.response!.data;
  240. // }
  241. super.onError(err, handler);
  242. }
  243. @override
  244. void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
  245. // TODO: implement onRequest
  246. super.onRequest(options, handler);
  247. }
  248. @override
  249. void onResponse(Response response, ResponseInterceptorHandler handler) {
  250. // TODO: implement onResponse
  251. super.onResponse(response, handler);
  252. }
  253. }