reason

fixed:dio拦截器解析message数据格式问题

......@@ -54,8 +54,8 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Get verification code"),
"inputEmailHint":
MessageLookupByLibrary.simpleMessage("Please enter email address"),
"inputPasswordHint":
MessageLookupByLibrary.simpleMessage("Please enter the password"),
"inputPasswordHint": MessageLookupByLibrary.simpleMessage(
"Please enter the password(at least 6)"),
"inputPhoneHint":
MessageLookupByLibrary.simpleMessage("Please enter phone number"),
"inputPhoneInvalid": MessageLookupByLibrary.simpleMessage(
......
......@@ -46,7 +46,8 @@ class MessageLookup extends MessageLookupByLibrary {
"forgotPasswordLink": MessageLookupByLibrary.simpleMessage("忘记密码"),
"getVerificationCode": MessageLookupByLibrary.simpleMessage("获取验证码"),
"inputEmailHint": MessageLookupByLibrary.simpleMessage("请输入邮箱地址"),
"inputPasswordHint": MessageLookupByLibrary.simpleMessage("请输入密码"),
"inputPasswordHint":
MessageLookupByLibrary.simpleMessage("请输入密码(至少6位字母和数字组合)"),
"inputPhoneHint": MessageLookupByLibrary.simpleMessage("请输入手机号"),
"inputPhoneInvalid": MessageLookupByLibrary.simpleMessage("请输入有效的手机号"),
"inputUsernameHint": MessageLookupByLibrary.simpleMessage("请输入账号"),
......
......@@ -9,6 +9,8 @@ import 'package:Parlando/category/models/category_item_entity.dart';
import 'package:Parlando/generated/json/category_item_entity.g.dart';
import 'package:Parlando/home/models/setting_entity.dart';
import 'package:Parlando/generated/json/setting_entity.g.dart';
import 'package:Parlando/login/models/login_entity.dart';
import 'package:Parlando/generated/json/login_entity.g.dart';
import 'package:Parlando/poem/models/lang_sort_entity.dart';
import 'package:Parlando/generated/json/lang_sort_entity.g.dart';
import 'package:Parlando/poem/models/search_entity.dart';
......@@ -102,6 +104,15 @@ class JsonConvert {
if (type == (SettingError).toString()) {
return SettingError.fromJson(json) as M;
}
if (type == (LoginEntity).toString()) {
return LoginEntity.fromJson(json) as M;
}
if (type == (LoginData).toString()) {
return LoginData.fromJson(json) as M;
}
if (type == (LoginError).toString()) {
return LoginError.fromJson(json) as M;
}
if (type == (LangSortEntity).toString()) {
return LangSortEntity.fromJson(json) as M;
}
......@@ -113,18 +124,18 @@ class JsonConvert {
}
if (type == (SearchItemsOwner).toString()) {
return SearchItemsOwner.fromJson(json) as M;
}
if(type == (SearchItemsLicense).toString()){
return SearchItemsLicense.fromJson(json) as M;
}
if(type == (FriendEntity).toString()){
return FriendEntity.fromJson(json) as M;
}
if(type == (FriendData).toString()){
return FriendData.fromJson(json) as M;
}
}
if (type == (SearchItemsLicense).toString()) {
return SearchItemsLicense.fromJson(json) as M;
}
if (type == (FriendEntity).toString()) {
return FriendEntity.fromJson(json) as M;
}
if (type == (FriendData).toString()) {
return FriendData.fromJson(json) as M;
}
print("$type not found");
print("$type not found");
return null;
}
......@@ -165,6 +176,21 @@ class JsonConvert {
(Map<String, dynamic> e) => SettingError.fromJson(e))
.toList() as M;
}
if (<LoginEntity>[] is M) {
return data
.map<LoginEntity>((Map<String, dynamic> e) => LoginEntity.fromJson(e))
.toList() as M;
}
if (<LoginData>[] is M) {
return data
.map<LoginData>((Map<String, dynamic> e) => LoginData.fromJson(e))
.toList() as M;
}
if (<LoginError>[] is M) {
return data
.map<LoginError>((Map<String, dynamic> e) => LoginError.fromJson(e))
.toList() as M;
}
if (<LangSortEntity>[] is M) {
return data
.map<LangSortEntity>(
......@@ -183,19 +209,30 @@ class JsonConvert {
.toList() as M;
}
if (<SearchItemsOwner>[] is M) {
return data.map<SearchItemsOwner>((Map<String, dynamic> e) => SearchItemsOwner.fromJson(e)).toList() as M;
}
if(<SearchItemsLicense>[] is M){
return data.map<SearchItemsLicense>((Map<String, dynamic> e) => SearchItemsLicense.fromJson(e)).toList() as M;
}
if(<FriendEntity>[] is M){
return data.map<FriendEntity>((Map<String, dynamic> e) => FriendEntity.fromJson(e)).toList() as M;
}
if(<FriendData>[] is M){
return data.map<FriendData>((Map<String, dynamic> e) => FriendData.fromJson(e)).toList() as M;
}
return data
.map<SearchItemsOwner>(
(Map<String, dynamic> e) => SearchItemsOwner.fromJson(e))
.toList() as M;
}
if (<SearchItemsLicense>[] is M) {
return data
.map<SearchItemsLicense>(
(Map<String, dynamic> e) => SearchItemsLicense.fromJson(e))
.toList() as M;
}
if (<FriendEntity>[] is M) {
return data
.map<FriendEntity>(
(Map<String, dynamic> e) => FriendEntity.fromJson(e))
.toList() as M;
}
if (<FriendData>[] is M) {
return data
.map<FriendData>((Map<String, dynamic> e) => FriendData.fromJson(e))
.toList() as M;
}
print("${M.toString()} not found");
print("${M.toString()} not found");
return null;
}
......
......@@ -22,16 +22,16 @@ CategoryItemEntity $CategoryItemEntityFromJson(Map<String, dynamic> json) {
final String? poem = jsonConvert.convert<String>(json['poem']);
if (poem != null) {
categoryItemEntity.poem = poem;
}
final String? author = jsonConvert.convert<String>(json['author']);
if (author != null) {
categoryItemEntity.author = author;
}
final String? bgImage = jsonConvert.convert<String>(json['bg_image']);
if (bgImage != null) {
categoryItemEntity.bgImage = bgImage;
}
return categoryItemEntity;
}
final String? author = jsonConvert.convert<String>(json['author']);
if (author != null) {
categoryItemEntity.author = author;
}
final String? bgImage = jsonConvert.convert<String>(json['bg_image']);
if (bgImage != null) {
categoryItemEntity.bgImage = bgImage;
}
return categoryItemEntity;
}
Map<String, dynamic> $CategoryItemEntityToJson(CategoryItemEntity entity) {
......
import 'package:Parlando/generated/json/base/json_convert_content.dart';
import 'package:Parlando/login/models/login_entity.dart';
LoginEntity $LoginEntityFromJson(Map<String, dynamic> json) {
final LoginEntity loginEntity = LoginEntity();
final String? status = jsonConvert.convert<String>(json['status']);
if (status != null) {
loginEntity.status = status;
}
final int? code = jsonConvert.convert<int>(json['code']);
if (code != null) {
loginEntity.code = code;
}
final String? message = jsonConvert.convert<String>(json['message']);
if (message != null) {
loginEntity.message = message;
}
final LoginData? data = jsonConvert.convert<LoginData>(json['data']);
if (data != null) {
loginEntity.data = data;
}
final LoginError? error = jsonConvert.convert<LoginError>(json['error']);
if (error != null) {
loginEntity.error = error;
}
return loginEntity;
}
Map<String, dynamic> $LoginEntityToJson(LoginEntity entity) {
final Map<String, dynamic> data = <String, dynamic>{};
data['status'] = entity.status;
data['code'] = entity.code;
data['message'] = entity.message;
data['data'] = entity.data?.toJson();
data['error'] = entity.error?.toJson();
return data;
}
LoginData $LoginDataFromJson(Map<String, dynamic> json) {
final LoginData loginData = LoginData();
final String? token = jsonConvert.convert<String>(json['token']);
if (token != null) {
loginData.token = token;
}
return loginData;
}
Map<String, dynamic> $LoginDataToJson(LoginData entity) {
final Map<String, dynamic> data = <String, dynamic>{};
data['token'] = entity.token;
return data;
}
LoginError $LoginErrorFromJson(Map<String, dynamic> json) {
final LoginError loginError = LoginError();
return loginError;
}
Map<String, dynamic> $LoginErrorToJson(LoginError entity) {
final Map<String, dynamic> data = <String, dynamic>{};
return data;
}
......@@ -88,4 +88,4 @@ SettingError $SettingErrorFromJson(Map<String, dynamic> json) {
Map<String, dynamic> $SettingErrorToJson(SettingError entity) {
final Map<String, dynamic> data = <String, dynamic>{};
return data;
}
}
\ No newline at end of file
......
......@@ -100,12 +100,12 @@ class S {
);
}
/// `Please enter the password`
/// `Please enter the password(at least 6)`
String get inputPasswordHint {
return Intl.message(
'Please enter the password',
'Please enter the password(at least 6)',
name: 'inputPasswordHint',
desc: 'Please enter the password',
desc: 'Please enter the password(at least 6)',
args: [],
);
}
......
......@@ -30,9 +30,9 @@
"type": "text",
"placeholders": {}
},
"inputPasswordHint": "Please enter the password",
"inputPasswordHint": "Please enter the password(at least 6)",
"@inputPasswordHint": {
"description": "Please enter the password",
"description": "Please enter the password(at least 6)",
"type": "text",
"placeholders": {}
},
......@@ -137,7 +137,6 @@
"type": "text",
"placeholders": {}
},
"accountEditPageUserInfo": "User Info",
"@accountEditPageTitle": {
"description": "User Info",
......
......@@ -4,7 +4,7 @@
"passwordLogin": "密码登录",
"login": "登录",
"forgotPasswordLink": "忘记密码",
"inputPasswordHint": "请输入密码",
"inputPasswordHint": "请输入密码(至少6位字母和数字组合)",
"inputUsernameHint": "请输入账号",
"noAccountRegisterLink": "还没账号?快去注册",
"register": "注册",
......
import 'dart:convert';
import 'package:Parlando/generated/json/base/json_field.dart';
import 'package:Parlando/generated/json/login_entity.g.dart';
@JsonSerializable()
class LoginEntity {
String? status;
int? code;
String? message;
LoginData? data;
LoginError? error;
LoginEntity();
factory LoginEntity.fromJson(Map<String, dynamic> json) =>
$LoginEntityFromJson(json);
Map<String, dynamic> toJson() => $LoginEntityToJson(this);
@override
String toString() {
return jsonEncode(this);
}
}
@JsonSerializable()
class LoginData {
String? token;
LoginData();
factory LoginData.fromJson(Map<String, dynamic> json) =>
$LoginDataFromJson(json);
Map<String, dynamic> toJson() => $LoginDataToJson(this);
@override
String toString() {
return jsonEncode(this);
}
}
@JsonSerializable()
class LoginError {
LoginError();
factory LoginError.fromJson(Map<String, dynamic> json) =>
$LoginErrorFromJson(json);
Map<String, dynamic> toJson() => $LoginErrorToJson(this);
@override
String toString() {
return jsonEncode(this);
}
}
import 'package:Parlando/login/models/login_entity.dart';
import 'package:Parlando/net/dio_utils.dart';
import 'package:Parlando/net/http_api.dart';
import 'package:Parlando/util/toast_utils.dart';
import 'package:flustars/flustars.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
......@@ -16,6 +19,7 @@ import 'package:Parlando/util/other_utils.dart';
import 'package:Parlando/widgets/my_app_bar.dart';
import 'package:Parlando/widgets/my_button.dart';
import 'package:Parlando/widgets/my_scroll_view.dart';
import 'package:getwidget/getwidget.dart';
import '../login_router.dart';
......@@ -40,7 +44,7 @@ class _LoginPageState extends State<LoginPage>
final FocusNode _nodeText1 = FocusNode();
final FocusNode _nodeText2 = FocusNode();
bool _clickable = false;
bool isLogin = false;
bool _isLoading = false;
@override
Map<ChangeNotifier, List<VoidCallback>?>? changeNotifier() {
......@@ -72,7 +76,7 @@ class _LoginPageState extends State<LoginPage>
Future.delayed(
Duration.zero,
() {
() {
NavigatorUtils.pushPageByFade(
context: context,
//目标页面
......@@ -106,7 +110,7 @@ class _LoginPageState extends State<LoginPage>
final String name = _nameController.text;
final String password = _passwordController.text;
bool clickable = true;
if (name.isEmpty || name.length < 11) {
if (name.isEmpty || name.length < 5) {
clickable = false;
}
if (password.isEmpty || password.length < 6) {
......@@ -122,13 +126,28 @@ class _LoginPageState extends State<LoginPage>
}
void _login() {
isLogin = true;
setState(() {});
Future.delayed(const Duration(seconds: 2), () {
//TODO 接入接口后获得user token则表明登录成功
SpUtil.putString(Constant.userToken, "this is user token!");
NavigatorUtils.push(context, Routes.home, clearStack: true);
});
_isLoading = true;
setState(() {});
Map<String, String> params = <String, String>{
"email": _nameController.text,
"password": _passwordController.text,
};
DioUtils.instance.asyncRequestNetwork<LoginEntity>(
Method.post,
HttpApi.login,
params: params,
onSuccess: (data) {
SpUtil.putString(Constant.userToken, data!.data!.token!);
NavigatorUtils.push(context, Routes.home, clearStack: true);
_isLoading = false;
},
onError: (code, msg) {
Toast.show(msg.toString());
_isLoading = false;
setState(() {});
},
);
}
@override
......@@ -167,112 +186,108 @@ class _LoginPageState extends State<LoginPage>
),
children: _buildBody,
),
isLogin
? const Center(
child: CupertinoActivityIndicator(
radius: 16.0,
),
)
: Container(),
Container(
child: _isLoading ? const GFLoader() : null,
),
],
),
);
}
List<Widget> get _buildBody => <Widget>[
Text(
ParlandoLocalizations.of(context).passwordLogin,
style: TextStyles.textBold26,
),
Gaps.vGap16,
MyTextField(
key: const Key('phone'),
Text(
ParlandoLocalizations.of(context).passwordLogin,
style: TextStyles.textBold26,
),
Gaps.vGap16,
MyTextField(
key: const Key('email'),
focusNode: _nodeText1,
controller: _nameController,
maxLength: 11,
keyboardType: TextInputType.phone,
hintText: ParlandoLocalizations.of(context).inputUsernameHint,
maxLength: 100,
keyboardType: TextInputType.emailAddress,
hintText: ParlandoLocalizations.of(context).inputEmailHint,
),
Gaps.vGap8,
MyTextField(
key: const Key('password'),
keyName: 'password',
focusNode: _nodeText2,
isInputPwd: true,
controller: _passwordController,
keyboardType: TextInputType.visiblePassword,
hintText: ParlandoLocalizations.of(context).inputPasswordHint,
),
Gaps.vGap24,
Text.rich(
TextSpan(
text: '登录即代表同意并阅读',
style: const TextStyle(fontSize: 12, color: Color(0xFF999999)),
children: [
TextSpan(
text: '《用户协议》',
style: TextStyle(color: Theme.of(context).primaryColor),
recognizer: TapGestureRecognizer()
..onTap = () {
Navigator.of(context)
.push(MaterialPageRoute(builder: (context) {
Gaps.vGap8,
MyTextField(
key: const Key('password'),
keyName: 'password',
focusNode: _nodeText2,
isInputPwd: true,
controller: _passwordController,
keyboardType: TextInputType.visiblePassword,
hintText: ParlandoLocalizations.of(context).inputPasswordHint,
),
Gaps.vGap24,
Text.rich(
TextSpan(
text: '登录即代表同意并阅读',
style: const TextStyle(fontSize: 12, color: Color(0xFF999999)),
children: [
TextSpan(
text: '《用户协议》',
style: TextStyle(color: Theme.of(context).primaryColor),
recognizer: TapGestureRecognizer()
..onTap = () {
Navigator.of(context)
.push(MaterialPageRoute(builder: (context) {
return const WebViewPage(
title: '《用户协议》',
url: Constant.protocolUrl,
);
}));
},
),
const TextSpan(text: ' & '),
TextSpan(
text: '《隐私政策》',
style: TextStyle(color: Theme.of(context).primaryColor),
recognizer: TapGestureRecognizer()
..onTap = () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) {
return const WebViewPage(
title: '《用户协议》',
url: Constant.protocolUrl,
title: '《隐私政策》',
url: Constant.privacyUrl,
);
}));
},
),
const TextSpan(text: ' & '),
TextSpan(
text: '《隐私政策》',
style: TextStyle(color: Theme.of(context).primaryColor),
recognizer: TapGestureRecognizer()
..onTap = () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) {
return const WebViewPage(
title: '《隐私政策》',
url: Constant.privacyUrl,
);
},
),
);
},
),
]),
),
Gaps.vGap16,
MyButton(
key: const Key('login'),
onPressed: _clickable ? _login : null,
text: ParlandoLocalizations.of(context).login,
),
Container(
height: 40.px,
alignment: Alignment.centerRight,
child: GestureDetector(
child: Text(
ParlandoLocalizations.of(context).forgotPasswordLink,
key: const Key('forgotPassword'),
style: Theme.of(context).textTheme.subtitle2,
},
),
);
},
),
onTap: () =>
NavigatorUtils.push(context, LoginRouter.resetPasswordPage),
),
]),
),
Gaps.vGap16,
MyButton(
key: const Key('login'),
onPressed: _clickable ? _login : null,
text: ParlandoLocalizations.of(context).login,
),
Container(
height: 40.px,
alignment: Alignment.centerRight,
child: GestureDetector(
child: Text(
ParlandoLocalizations.of(context).forgotPasswordLink,
key: const Key('forgotPassword'),
style: Theme.of(context).textTheme.subtitle2,
),
Gaps.vGap16,
Container(
alignment: Alignment.center,
child: GestureDetector(
child: Text(
ParlandoLocalizations.of(context).noAccountRegisterLink,
key: const Key('noAccountRegister'),
style: TextStyle(color: Theme.of(context).primaryColor),
),
onTap: () =>
NavigatorUtils.push(context, LoginRouter.registerPage),
))
];
onTap: () =>
NavigatorUtils.push(context, LoginRouter.resetPasswordPage),
),
),
Gaps.vGap16,
Container(
alignment: Alignment.center,
child: GestureDetector(
child: Text(
ParlandoLocalizations.of(context).noAccountRegisterLink,
key: const Key('noAccountRegister'),
style: TextStyle(color: Theme.of(context).primaryColor),
),
onTap: () =>
NavigatorUtils.push(context, LoginRouter.registerPage),
))
];
}
......
......@@ -59,7 +59,7 @@ class _RegisterPageState extends State<RegisterPage>
final String vCode = _vCodeController.text;
final String password = _passwordController.text;
bool clickable = true;
if (name.isEmpty || name.length < 11) {
if (name.isEmpty || name.length < 5) {
clickable = false;
}
if (vCode.isEmpty || vCode.length < 6) {
......@@ -95,6 +95,7 @@ class _RegisterPageState extends State<RegisterPage>
onError: (code, msg) {
Toast.show(msg);
_isLoading = false;
setState(() {});
},
);
}
......@@ -123,7 +124,7 @@ class _RegisterPageState extends State<RegisterPage>
),
Gaps.vGap16,
MyTextField(
key: const Key('phone'),
key: const Key('email'),
focusNode: _nodeText1,
controller: _nameController,
maxLength: 100,
......
......@@ -35,7 +35,6 @@ typedef NetErrorCallback = Function(int code, String msg);
/// @weilu https://github.com/simplezhli
class DioUtils {
factory DioUtils() => _singleton;
DioUtils._() {
......@@ -43,6 +42,7 @@ class DioUtils {
connectTimeout: _connectTimeout,
receiveTimeout: _receiveTimeout,
sendTimeout: _sendTimeout,
/// dio默认json解析,这里指定返回UTF8字符串,自己处理解析。(可也以自定义Transformer实现)
responseType: ResponseType.plain,
validateStatus: (_) {
......@@ -53,6 +53,7 @@ class DioUtils {
// contentType: Headers.formUrlEncodedContentType, // 适用于post form表单提交
);
_dio = Dio(_options);
/// Fiddler抓包代理配置 https://www.jianshu.com/p/d831b1f7c45b
// (_dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
// (HttpClient client) {
......@@ -68,6 +69,7 @@ class DioUtils {
void addInterceptor(Interceptor interceptor) {
_dio.interceptors.add(interceptor);
}
_interceptors.forEach(addInterceptor);
}
......@@ -80,7 +82,9 @@ class DioUtils {
Dio get dio => _dio;
// 数据返回格式统一,统一处理异常
Future<BaseEntity<T>> _request<T>(String method, String url, {
Future<BaseEntity<T>> _request<T>(
String method,
String url, {
Object? data,
Map<String, dynamic>? queryParameters,
CancelToken? cancelToken,
......@@ -95,14 +99,16 @@ class DioUtils {
);
try {
final String data = response.data.toString();
/// 集成测试无法使用 isolate https://github.com/flutter/flutter/issues/24703
/// 使用compute条件:数据大于10KB(粗略使用10 * 1024)且当前不是集成测试(后面可能会根据Web环境进行调整)
/// 主要目的减少不必要的性能开销
final bool isCompute = !Constant.isDriverTest && data.length > 10 * 1024;
debugPrint('isCompute:$isCompute');
final Map<String, dynamic> _map = isCompute ? await compute(parseData, data) : parseData(data);
final Map<String, dynamic> _map =
isCompute ? await compute(parseData, data) : parseData(data);
return BaseEntity<T>.fromJson(_map);
} catch(e) {
} catch (e) {
debugPrint(e.toString());
return BaseEntity<T>(ExceptionHandle.parse_error, '数据解析错误!', null);
}
......@@ -114,7 +120,9 @@ class DioUtils {
return options;
}
Future requestNetwork<T>(Method method, String url, {
Future requestNetwork<T>(
Method method,
String url, {
NetSuccessCallback<T?>? onSuccess,
NetErrorCallback? onError,
Object? params,
......@@ -122,7 +130,9 @@ class DioUtils {
CancelToken? cancelToken,
Options? options,
}) {
return _request<T>(method.value, url,
return _request<T>(
method.value,
url,
data: params,
queryParameters: queryParameters,
options: options,
......@@ -141,7 +151,9 @@ class DioUtils {
}
/// 统一处理(onSuccess返回T对象,onSuccessList返回 List<T>)
void asyncRequestNetwork<T>(Method method, String url, {
void asyncRequestNetwork<T>(
Method method,
String url, {
NetSuccessCallback<T?>? onSuccess,
NetErrorCallback? onError,
Object? params,
......@@ -149,13 +161,14 @@ class DioUtils {
CancelToken? cancelToken,
Options? options,
}) {
Stream.fromFuture(_request<T>(method.value, url,
Stream.fromFuture(_request<T>(
method.value,
url,
data: params,
queryParameters: queryParameters,
options: options,
cancelToken: cancelToken,
)).asBroadcastStream()
.listen((result) {
)).asBroadcastStream().listen((result) {
if (result.code == 0) {
if (onSuccess != null) {
onSuccess(result.data);
......@@ -190,14 +203,7 @@ Map<String, dynamic> parseData(String data) {
return json.decode(data) as Map<String, dynamic>;
}
enum Method {
get,
post,
put,
patch,
delete,
head
}
enum Method { get, post, put, patch, delete, head }
/// 使用拓展枚举替代 switch判断取值
/// https://zhuanlan.zhihu.com/p/98545689
......
......@@ -2,6 +2,7 @@ class HttpApi {
static const String setting = 'setting';
static const String register = 'register';
static const String verify = 'verify';
static const String login = 'login';
static const String search = 'search/repositories';
static const String subscriptions = 'users/simplezhli/subscriptions';
static const String upload = 'uuc/upload-inco';
......
......@@ -27,28 +27,29 @@ class AuthInterceptor extends Interceptor {
}
class TokenInterceptor extends Interceptor {
Dio? _tokenDio;
Future<String?> getToken() async {
final Map<String, String> params = <String, String>{};
params['refresh_token'] = SpUtil.getString(Constant.refreshToken).nullSafe;
try {
_tokenDio ??= Dio();
_tokenDio!.options = DioUtils.instance.dio.options;
final Response response = await _tokenDio!.post<dynamic>('lgn/refreshToken', data: params);
final Response response =
await _tokenDio!.post<dynamic>('lgn/refreshToken', data: params);
if (response.statusCode == ExceptionHandle.success) {
return (json.decode(response.data.toString()) as Map<String, dynamic>)['access_token'] as String;
return (json.decode(response.data.toString())
as Map<String, dynamic>)['access_token'] as String;
}
} catch(e) {
} catch (e) {
Log.e('刷新Token失败!');
}
return null;
}
@override
Future<void> onResponse(Response response, ResponseInterceptorHandler handler) async {
Future<void> onResponse(
Response response, ResponseInterceptorHandler handler) async {
//401代表token过期
if (response.statusCode == ExceptionHandle.unauthorized) {
Log.d('-----------自动刷新Token------------');
......@@ -71,8 +72,10 @@ class TokenInterceptor extends Interceptor {
try {
Log.e('----------- 重新请求接口 ------------');
/// 避免重复执行拦截器,使用tokenDio
final Response response = await _tokenDio!.request<dynamic>(request.path,
final Response response = await _tokenDio!.request<dynamic>(
request.path,
data: request.data,
queryParameters: request.queryParameters,
cancelToken: request.cancelToken,
......@@ -89,11 +92,10 @@ class TokenInterceptor extends Interceptor {
}
}
class LoggingInterceptor extends Interceptor{
class LoggingInterceptor extends Interceptor {
late DateTime _startTime;
late DateTime _endTime;
@override
void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
_startTime = DateTime.now();
......@@ -101,7 +103,8 @@ class LoggingInterceptor extends Interceptor{
if (options.queryParameters.isEmpty) {
Log.d('RequestUrl: ${options.baseUrl}${options.path}');
} else {
Log.d('RequestUrl: ${options.baseUrl}${options.path}?${Transformer.urlEncodeMap(options.queryParameters)}');
Log.d(
'RequestUrl: ${options.baseUrl}${options.path}?${Transformer.urlEncodeMap(options.queryParameters)}');
}
Log.d('RequestMethod: ${options.method}');
Log.d('RequestHeaders:${options.headers}');
......@@ -109,7 +112,7 @@ class LoggingInterceptor extends Interceptor{
Log.d('RequestData: ${options.data.toString()}');
super.onRequest(options, handler);
}
@override
void onResponse(Response response, ResponseInterceptorHandler handler) {
_endTime = DateTime.now();
......@@ -124,7 +127,7 @@ class LoggingInterceptor extends Interceptor{
Log.d('----------End: $duration 毫秒----------');
super.onResponse(response, handler);
}
@override
void onError(DioError err, ErrorInterceptorHandler handler) {
Log.d('----------Error-----------');
......@@ -132,8 +135,7 @@ class LoggingInterceptor extends Interceptor{
}
}
class AdapterInterceptor extends Interceptor{
class AdapterInterceptor extends Interceptor {
static const String _kMsg = 'msg';
static const String _kSlash = "'";
static const String _kMessage = 'message';
......@@ -143,13 +145,13 @@ class AdapterInterceptor extends Interceptor{
static const String _kFailureFormat = '{"code":%d,"message":"%s"}';
static const String _kSuccessFormat = '{"code":0,"data":%s,"message":""}';
@override
void onResponse(Response response, ResponseInterceptorHandler handler) {
final Response r = adapterData(response);
super.onResponse(r, handler);
}
@override
void onError(DioError err, ErrorInterceptorHandler handler) {
if (err.response != null) {
......@@ -161,8 +163,10 @@ class AdapterInterceptor extends Interceptor{
Response adapterData(Response response) {
String result;
String content = response.data?.toString() ?? '';
/// 成功时,直接格式化返回
if (response.statusCode == ExceptionHandle.success || response.statusCode == ExceptionHandle.success_not_content) {
if (response.statusCode == ExceptionHandle.success ||
response.statusCode == ExceptionHandle.success_not_content) {
if (content.isEmpty) {
content = _kDefaultText;
}
......@@ -180,11 +184,8 @@ class AdapterInterceptor extends Interceptor{
} else {
String msg;
try {
content = content.replaceAll(r'\', '');
if (_kSlash == content.substring(0, 1)) {
content = content.substring(1, content.length - 1);
}
final Map<String, dynamic> map = json.decode(content) as Map<String, dynamic>;
final Map<String, dynamic> map =
json.decode(content) as Map<String, dynamic>;
if (map.containsKey(_kMessage)) {
msg = map[_kMessage] as String;
} else if (map.containsKey(_kMsg)) {
......@@ -202,7 +203,8 @@ class AdapterInterceptor extends Interceptor{
} catch (e) {
// Log.d('异常信息:$e');
// 解析异常直接按照返回原数据处理(一般为返回500,503 HTML页面代码)
result = sprintf(_kFailureFormat, [response.statusCode, '服务器异常(${response.statusCode})']);
result = sprintf(_kFailureFormat,
[response.statusCode, '服务器异常(${response.statusCode})']);
}
}
}
......