基础库
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 
 

253 rader
7.8 KiB

  1. import 'dart:convert';
  2. import 'dart:io';
  3. import 'package:dio/adapter.dart';
  4. import 'package:dio/dio.dart';
  5. import 'package:zhiying_comm/util/empty_util.dart';
  6. import 'package:zhiying_comm/zhiying_comm.dart';
  7. import 'global_config.dart';
  8. import 'shared_prefe_util.dart';
  9. class Api {
  10. final String path;
  11. Map<String, dynamic> params;
  12. final NetMethod method;
  13. static Dio _dio;
  14. static get _net async {
  15. if (_dio == null) {
  16. var setting = await NativeUtil.getSetting();
  17. String domain = setting['domain']; //'http://www.hairuyi.com/';
  18. _config(domain, proxyUrl: '192.168.0.112:8888');
  19. }
  20. return _dio;
  21. }
  22. Api(this.path, {this.params, this.method = NetMethod.POST}) {
  23. this.params = params ?? {};
  24. }
  25. Future<Map> onCache() async {
  26. String cacheKey = getRequestParamsCachedKey(params, path);
  27. // 读取缓存
  28. Map<String, dynamic> cacheMap =
  29. await SharedPreferencesUtil.getNetCacheResult(cacheKey);
  30. if (!EmptyUtil.isEmpty(cacheMap) &&
  31. cacheMap.containsKey(GlobalConfig.HTTP_RESPONSE_KEY_CODE) &&
  32. (cacheMap[GlobalConfig.HTTP_RESPONSE_KEY_CODE] ==
  33. GlobalConfig.RESPONSE_SUCCESS_CODE ||
  34. cacheMap[GlobalConfig.HTTP_RESPONSE_KEY_CODE] ==
  35. '${GlobalConfig.RESPONSE_SUCCESS_CODE}') &&
  36. !EmptyUtil.isEmpty(cacheMap[GlobalConfig.HTTP_RESPONSE_KEY_DATA])) {
  37. return cacheMap[GlobalConfig.HTTP_RESPONSE_KEY_DATA];
  38. }
  39. return {};
  40. }
  41. Future<Map> onRequest() async {
  42. Map result = {};
  43. try {
  44. Dio net = await _net;
  45. Map<String, String> headers = await _getHeaders();
  46. var responds = await net.request(path,
  47. data: params,
  48. options: Options(method: enumToString(method), headers: headers));
  49. result = responds.data is Map ? responds.data : jsonDecode(responds.data);
  50. String cacheKey = getRequestParamsCachedKey(params, path);
  51. _setCallBackCacheData(cacheKey,
  52. responds.data is Map ? jsonEncode(responds.data) : responds.data);
  53. } on DioError catch (e) {
  54. _formatError(e);
  55. return {};
  56. }
  57. return result[GlobalConfig.HTTP_RESPONSE_KEY_DATA];
  58. }
  59. // 获取headers,headers保存各种签名认证信息
  60. Future<Map<String, String>> _getHeaders() async {
  61. Map<String, String> headers = Map();
  62. headers['device'] = 'wx_applet';
  63. headers['Platform'] = 'wx_applet';
  64. // token 读取SP缓存中的用户token
  65. String token = await SharedPreferencesUtil.getStringValue(
  66. GlobalConfig.SHARED_KEY_TOKEN) ??
  67. '';
  68. const bool inProduction = const bool.fromEnvironment("dart.vm.product");
  69. if (!inProduction && token != '') {
  70. token = 'dda64038e024307436aae390d1242ceaba89040d';
  71. }
  72. if (token != null && token != '') {
  73. headers['token'] = token;
  74. }
  75. return headers;
  76. }
  77. /// 配置网络请求,基础地址,代理地址,如:192.168.0.123:8888(代理地址生产环境无效)
  78. /// apiVersion 接口版本
  79. static void _config(String baseUrl, {String proxyUrl}) {
  80. _dio = Dio(BaseOptions(
  81. method: "post",
  82. baseUrl: baseUrl,
  83. connectTimeout: 15000,
  84. receiveTimeout: 15000,
  85. contentType: Headers.jsonContentType,
  86. followRedirects: true,
  87. ));
  88. _dio.interceptors.add(_NetInterceptors());
  89. // _dio.interceptors.add(LogInterceptor());
  90. const bool inProduction = const bool.fromEnvironment("dart.vm.product");
  91. if (proxyUrl != null && proxyUrl != '' && !inProduction) {
  92. _setProxy(proxyUrl);
  93. }
  94. }
  95. /// 设置代理
  96. static void _setProxy(String proxyUrl) {
  97. (_dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
  98. (HttpClient client) {
  99. client.findProxy = (uri) {
  100. return "PROXY $proxyUrl";
  101. };
  102. client.badCertificateCallback =
  103. (X509Certificate cert, String host, int port) => true;
  104. };
  105. }
  106. /// 获取请求缓存成功的数据
  107. static Future<void> _onCallBackCacheData(
  108. OnCache onCache, String cacheKey) async {
  109. // 读取缓存
  110. Map<String, dynamic> cacheMap =
  111. await SharedPreferencesUtil.getNetCacheResult(cacheKey);
  112. if (!EmptyUtil.isEmpty(cacheMap) &&
  113. cacheMap.containsKey(GlobalConfig.HTTP_RESPONSE_KEY_CODE) &&
  114. (cacheMap[GlobalConfig.HTTP_RESPONSE_KEY_CODE] ==
  115. GlobalConfig.RESPONSE_SUCCESS_CODE ||
  116. cacheMap[GlobalConfig.HTTP_RESPONSE_KEY_CODE] ==
  117. '${GlobalConfig.RESPONSE_SUCCESS_CODE}') &&
  118. !EmptyUtil.isEmpty(cacheMap[GlobalConfig.HTTP_RESPONSE_KEY_DATA])) {
  119. onCache(cacheMap[GlobalConfig.HTTP_RESPONSE_KEY_DATA]);
  120. return;
  121. }
  122. return;
  123. }
  124. /// 缓存请求成功的数据
  125. static void _setCallBackCacheData(String cacheKey, String value) async {
  126. SharedPreferencesUtil.setNetCacheResult(cacheKey, value);
  127. }
  128. /// 根据请求参数,获取缓存的数据
  129. static Future<dynamic> getRequestCachedData(String url,
  130. {Map<String, dynamic> params}) async {
  131. Map<String, dynamic> cacheMap =
  132. await SharedPreferencesUtil.getNetCacheResult(
  133. getRequestParamsCachedKey(params, url));
  134. if (!EmptyUtil.isEmpty(cacheMap) &&
  135. cacheMap.containsKey(GlobalConfig.HTTP_RESPONSE_KEY_CODE) &&
  136. (cacheMap[GlobalConfig.HTTP_RESPONSE_KEY_CODE] ==
  137. GlobalConfig.RESPONSE_SUCCESS_CODE ||
  138. cacheMap[GlobalConfig.HTTP_RESPONSE_KEY_CODE] ==
  139. '${GlobalConfig.RESPONSE_SUCCESS_CODE}') &&
  140. !EmptyUtil.isEmpty(cacheMap[GlobalConfig.HTTP_RESPONSE_KEY_DATA])) {
  141. return cacheMap[GlobalConfig.HTTP_RESPONSE_KEY_DATA];
  142. }
  143. return null;
  144. }
  145. /// 判断后台返回是否成功
  146. static bool isSuccess(Map<String, dynamic> data) {
  147. try {
  148. if (!EmptyUtil.isEmpty(data) &&
  149. (data[GlobalConfig.HTTP_RESPONSE_KEY_CODE] ==
  150. GlobalConfig.RESPONSE_SUCCESS_CODE ||
  151. data[GlobalConfig.HTTP_RESPONSE_KEY_CODE] ==
  152. '${GlobalConfig.RESPONSE_SUCCESS_CODE}')) {
  153. return true;
  154. }
  155. } catch (e) {
  156. return false;
  157. }
  158. return false;
  159. }
  160. /// 根据请求参数,获取缓存的Key
  161. static String getRequestParamsCachedKey(
  162. Map<String, dynamic> map, String path) {
  163. if (EmptyUtil.isEmpty(map)) {
  164. return EncodeUtil.generateMd5(path);
  165. }
  166. return EncodeUtil.generateMd5(path + map.toString());
  167. }
  168. /// 签名
  169. static String signWithArray(List<String> params) {
  170. // 字母升序
  171. params.sort();
  172. String result = "";
  173. // result += secret_key;
  174. params.forEach((param) {
  175. result += param;
  176. });
  177. // result += secret_key;
  178. return EncodeUtil.generateMd5(result);
  179. }
  180. /*
  181. * error统一处理
  182. */
  183. static void _formatError(DioError e) {
  184. if (e.type == DioErrorType.CONNECT_TIMEOUT) {
  185. Logger.error('连接超时: ${e.toString()}');
  186. } else if (e.type == DioErrorType.SEND_TIMEOUT) {
  187. Logger.error('请求超时: ${e.toString()}');
  188. } else if (e.type == DioErrorType.RECEIVE_TIMEOUT) {
  189. Logger.error('响应超时: ${e.toString()}');
  190. } else if (e.type == DioErrorType.RESPONSE) {
  191. Logger.error('出现异常: ${e.toString()}');
  192. } else if (e.type == DioErrorType.CANCEL) {
  193. Logger.error('请求取消: ${e.toString()}');
  194. } else {
  195. Logger.error('未知错误: ${e.toString()}');
  196. }
  197. }
  198. }
  199. /**
  200. * @description: 网络请求拦截器
  201. * @param {type}
  202. * @return:
  203. */
  204. class _NetInterceptors extends InterceptorsWrapper {
  205. @override
  206. Future onRequest(RequestOptions options) {
  207. Logger.net(options?.uri?.toString(), data: options.data.toString());
  208. // TODO 加密?
  209. return super.onRequest(options);
  210. }
  211. @override
  212. Future onResponse(Response response) {
  213. Logger.endNet(response?.request?.uri?.toString(),
  214. data: response?.data?.toString() ?? '');
  215. // TODO 解密?
  216. return super.onResponse(response);
  217. }
  218. @override
  219. Future onError(DioError err) {
  220. // Logger.error(err);
  221. return super.onError(err);
  222. }
  223. }