import 'dart:convert'; import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; import 'package:novyronst/common/help/help_log.dart'; import 'package:novyronst/common/help/help_time.dart'; import 'package:novyronst/common/help/help_token.dart'; import '../../tools/util/ny_device_info.dart'; import '../help/help_encrypt.dart'; /// 网络请求拦截器 class NyNetworkIntercept extends Interceptor { @override Future onRequest(RequestOptions options, RequestInterceptorHandler handler) async { await _addRequestHeaders(options); // 打印请求日志 HelpLog.print("🔶 REQUEST [${options.method.toUpperCase()}] ${options.uri}"); // HelpLog.print("Headers: ${options.headers}"); if (options.data != null) { HelpLog.print("Payload: ${options.data}"); } handler.next(options); } @override void onResponse(Response response, ResponseInterceptorHandler handler) { HelpLog.print("🟢 RESPONSE [${response.statusCode}] ${response.requestOptions.uri}"); // _logDebug("Body: ${response.data}"); // 处理 401 / 402 Token 过期 if (response.statusCode == 401 || response.statusCode == 402) { // 触发 Token 刷新 HelpToken().update(); if (response.statusCode == 402) { _handleError('errorCode:${response.statusCode}', true); } handler.reject(DioException( requestOptions: response.requestOptions, response: response, type: DioExceptionType.badResponse, error: 'errorCode:${response.statusCode}', )); return; } // Release 模式解密响应体 if (kReleaseMode && response.data is String) { try { final deStr = HelpEncrypt.deStr(response.data); response.data = jsonDecode(deStr); } catch (e) { HelpLog.print("解密失败: $e"); } } handler.next(response); } @override void onError(DioException err, ErrorInterceptorHandler handler) { HelpLog.print("🔴 Error: ${err.message}", tag: 'in onError'); handler.next(err); } Future _addRequestHeaders(RequestOptions options) async { if (!kReleaseMode) { options.headers['security'] = 'false'; } // 注入 Token final tokenManager = HelpToken(); final token = tokenManager.get(); if (token.isNotEmpty) { options.headers['Authorization'] = 'Bearer $token'; } // 其他公共参数 final deviceInfo = NyDeviceInfo.instance; options.headers.addAll({ 'product-prefix': 'glimzo', 'device-id': deviceInfo.deviceId, 'system-type': deviceInfo.systemType, 'model': deviceInfo.model, 'system-version': deviceInfo.systemVersion, 'brand': deviceInfo.brand, 'app-version': deviceInfo.appVersion, 'app-name': deviceInfo.appName, 'lang-key': 'en', 'time-zone': HelpTime.getTimeZone(), 'idfa': '', 'idfv': deviceInfo.idfv, 'device-gaid': '', }); await _handleOldToken(options); } Future _handleOldToken(RequestOptions options) async { try { if (options.data is Map) { final body = options.data as Map; final prevToken = body['prevToken']; if (prevToken != null && prevToken.toString().isNotEmpty) { options.headers['Authorization'] = prevToken.toString(); } } } catch (_) {} } void _handleError(dynamic e, bool error) { HelpLog.print("🔴 Error: $e", tag: 'in ---- _handleError'); } }