novyronst/lib/common/api/ny_network_intercept.dart

121 lines
3.5 KiB
Dart

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<void> 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<void> _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<void> _handleOldToken(RequestOptions options) async {
try {
if (options.data is Map<String, dynamic>) {
final body = options.data as Map<String, dynamic>;
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');
}
}