123 lines
3.5 KiB
Dart
123 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');
|
|
}
|
|
} |