api_router.dart 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import 'dart:convert';
  2. import 'package:archive/archive.dart';
  3. import 'package:dio/dio.dart';
  4. import '../../../utils/crypto.dart';
  5. import '../../../utils/developer/ix_developer_tools.dart';
  6. import '../../../utils/log/logger.dart';
  7. import '../../constants/keys.dart';
  8. import '../../data/models/api_exception.dart';
  9. import '../../data/models/api_result.dart';
  10. import '../../data/models/disconnect_domain.dart';
  11. import '../../data/sp/ix_sp.dart';
  12. import '../base/base_api.dart';
  13. import '../core/api_core_paths.dart';
  14. /// 核心API
  15. class ApiRouter extends BaseApi {
  16. static final _instance = ApiRouter._internal();
  17. factory ApiRouter() => _instance;
  18. ApiRouter._internal() {
  19. _initDio();
  20. }
  21. /// 初始化Dio
  22. void _initDio() {
  23. // 此处可以设置默认的DIO参数
  24. final options = BaseOptions();
  25. options.connectTimeout = const Duration(seconds: 15);
  26. options.receiveTimeout = const Duration(seconds: 15);
  27. options.responseType = ResponseType.bytes;
  28. options.headers['content-type'] = 'application/json';
  29. dio = Dio(options);
  30. dio.interceptors.add(SimpleApiMonitorInterceptor());
  31. // 添加拦截器
  32. _setupInterceptors();
  33. }
  34. // bool _isRefreshing = false;
  35. void _setupInterceptors() {
  36. dio.interceptors.add(
  37. InterceptorsWrapper(
  38. onRequest: (options, handler) async {
  39. // 在请求发送前添加token
  40. final user = IXSP.getUser();
  41. if (user != null) {
  42. options.headers['Authorization'] = user.accessToken;
  43. }
  44. return handler.next(options);
  45. },
  46. onError: (DioException error, handler) async {
  47. IXSP.addDisconnectDomain(
  48. DisconnectDomain(
  49. domain: error.requestOptions.baseUrl,
  50. status: error.response?.statusCode ?? -1,
  51. msg: error.message ?? '',
  52. startTime: DateTime.now().millisecondsSinceEpoch,
  53. endTime: DateTime.now().millisecondsSinceEpoch,
  54. count: 1,
  55. ),
  56. );
  57. return handler.next(error);
  58. },
  59. ),
  60. );
  61. }
  62. @override
  63. Map<String, dynamic>? getDefaultHeader() {
  64. // 可以设置自定义Header
  65. final headers = {
  66. 'X-NL-Product-Code': 'nomo',
  67. 'X-NL-Content-Encoding': 'gzip',
  68. };
  69. return headers;
  70. }
  71. @override
  72. Map<String, dynamic>? getDefaultQuery() {
  73. // 可以设置自定义Query
  74. return null;
  75. }
  76. @override
  77. dynamic encrypt(dynamic input) {
  78. try {
  79. final data = jsonEncode(input);
  80. final bytes = utf8.encode(data);
  81. final gzipEncoder = GZipEncoder();
  82. final compressedBytes = gzipEncoder.encode(bytes);
  83. log('ApiLog', '>>: $data');
  84. return Crypto.encryptBytesUint8(compressedBytes, Keys.aesKey, Keys.aesIv);
  85. } catch (error) {
  86. throw ApiException("-2", "encrypt error: $error");
  87. }
  88. }
  89. @override
  90. dynamic decrypt(dynamic input) {
  91. try {
  92. final decryptedBytes = Crypto.decryptBytes(
  93. base64Encode(input),
  94. Keys.aesKey,
  95. Keys.aesIv,
  96. );
  97. // 使用GZip解压
  98. final gzipDecoder = GZipDecoder();
  99. final decodeBytes = gzipDecoder.decodeBytes(decryptedBytes);
  100. final data = utf8.decode(decodeBytes);
  101. log('ApiLog', '<<:$data');
  102. return jsonDecode(data);
  103. } catch (error) {
  104. throw ApiException("-2", "decrypt error: $error");
  105. }
  106. }
  107. /// 获取调度信息
  108. Future<ApiResult> getDispatchInfo(
  109. dynamic data, {
  110. CancelToken? cancelToken,
  111. }) async {
  112. return post(
  113. ApiCorePaths.getDispatchInfo,
  114. data: data,
  115. cancelToken: cancelToken,
  116. );
  117. }
  118. }