api_log.dart 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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 ApiLog extends BaseApi {
  16. static final _instance = ApiLog._internal();
  17. factory ApiLog() => _instance;
  18. ApiLog._internal() {
  19. _initDio();
  20. }
  21. /// 初始化Dio
  22. void _initDio() {
  23. // 此处可以设置默认的DIO参数
  24. final options = BaseOptions();
  25. options.connectTimeout = const Duration(seconds: 90);
  26. options.receiveTimeout = const Duration(seconds: 90);
  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> uploadLogs(dynamic data) async {
  109. return post(ApiCorePaths.uploadLog, data: data, domainType: DomainType.log);
  110. }
  111. }