import 'dart:convert'; import 'package:archive/archive.dart'; import 'package:dio/dio.dart'; import '../../../utils/crypto.dart'; import '../../../utils/developer/ix_developer_tools.dart'; import '../../../utils/log/logger.dart'; import '../../constants/keys.dart'; import '../../data/models/api_exception.dart'; import '../../data/models/api_result.dart'; import '../../data/sp/ix_sp.dart'; import '../base/base_api.dart'; import '../core/api_core_paths.dart'; /// 核心API class ApiRouter extends BaseApi { static final _instance = ApiRouter._internal(); factory ApiRouter() => _instance; ApiRouter._internal() { _initDio(); } /// 初始化Dio void _initDio() { // 此处可以设置默认的DIO参数 final options = BaseOptions(); options.connectTimeout = const Duration(seconds: 15); options.receiveTimeout = const Duration(seconds: 15); options.responseType = ResponseType.bytes; options.headers['content-type'] = 'application/json'; dio = Dio(options); dio.interceptors.add(SimpleApiMonitorInterceptor()); // 添加拦截器 _setupInterceptors(); } // bool _isRefreshing = false; void _setupInterceptors() { dio.interceptors.add( InterceptorsWrapper( onRequest: (options, handler) async { // 在请求发送前添加token final user = IXSP.getUser(); if (user != null) { options.headers['Authorization'] = user.accessToken; } return handler.next(options); }, onError: (DioException error, handler) async { return handler.next(error); }, ), ); } @override Map? getDefaultHeader() { // 可以设置自定义Header final headers = { 'X-NL-Product-Code': 'nomo', 'X-NL-Content-Encoding': 'gzip', }; return headers; } @override Map? getDefaultQuery() { // 可以设置自定义Query return null; } @override dynamic encrypt(dynamic input) { try { final data = jsonEncode(input); final bytes = utf8.encode(data); final gzipEncoder = GZipEncoder(); final compressedBytes = gzipEncoder.encode(bytes); log('ApiLog', '>>: $data'); return Crypto.encryptBytesUint8(compressedBytes, Keys.aesKey, Keys.aesIv); } catch (error) { throw ApiException("-2", "encrypt error: $error"); } } @override dynamic decrypt(dynamic input) { try { final decryptedBytes = Crypto.decryptBytes( base64Encode(input), Keys.aesKey, Keys.aesIv, ); // 使用GZip解压 final gzipDecoder = GZipDecoder(); final decodeBytes = gzipDecoder.decodeBytes(decryptedBytes); final data = utf8.decode(decodeBytes); log('ApiLog', '<<:$data'); return jsonDecode(data); } catch (error) { throw ApiException("-2", "decrypt error: $error"); } } /// 获取调度信息 Future getDispatchInfo( dynamic data, { CancelToken? cancelToken, }) async { return post( ApiCorePaths.getDispatchInfo, data: data, cancelToken: cancelToken, ); } /// 连接成功 Future connected(dynamic data, {CancelToken? cancelToken}) async { return post(ApiCorePaths.connected, data: data, cancelToken: cancelToken); } }