intercept.dart 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. import 'dart:convert';
  2. import 'package:dio/dio.dart';
  3. import 'package:flustars/flustars.dart';
  4. import 'package:liftmanager/common/common.dart';
  5. import 'package:liftmanager/utils/log_utils.dart';
  6. import 'package:sprintf/sprintf.dart';
  7. import 'dio_utils.dart';
  8. import 'error_handle.dart';
  9. class AuthInterceptor extends Interceptor{
  10. @override
  11. onRequest(RequestOptions options) {
  12. String accessToken = SpUtil.getString(Constant.accessToken);
  13. if (accessToken.isNotEmpty){
  14. options.headers["Authorization"] = "$accessToken";
  15. }
  16. options.headers["MobileType"] = 1;
  17. return super.onRequest(options);
  18. }
  19. }
  20. //class TokenInterceptor extends Interceptor{
  21. //
  22. // Future<String> getToken() async {
  23. //
  24. // Map<String, String> params = Map();
  25. // params["refresh_token"] = SpUtil.getString(Constant.refreshToken);
  26. // try{
  27. // _tokenDio.options = DioUtils.instance.getDio().options;
  28. // var response = await _tokenDio.post("lgn/refreshToken", data: params);
  29. // if (response.statusCode == ExceptionHandle.success){
  30. // return json.decode(response.data.toString())["access_token"];
  31. // }
  32. // }catch(e){
  33. // Log.e("刷新Token失败!");
  34. // }
  35. // return null;
  36. // }
  37. //
  38. // Dio _tokenDio = Dio();
  39. //
  40. // @override
  41. // onResponse(Response response) async{
  42. // //401代表token过期
  43. // if (response != null && response.statusCode == ExceptionHandle.unauthorized) {
  44. // Log.d("-----------自动刷新Token------------");
  45. // Dio dio = DioUtils.instance.getDio();
  46. // dio.interceptors.requestLock.lock();
  47. // String accessToken = await getToken(); // 获取新的accessToken
  48. // Log.e("-----------NewToken: $accessToken ------------");
  49. // SpUtil.putString(Constant.accessToken, accessToken);
  50. // dio.interceptors.requestLock.unlock();
  51. //
  52. // if (accessToken != null){{
  53. // // 重新请求失败接口
  54. // var request = response.request;
  55. // request.headers["Authorization"] = "Bearer $accessToken";
  56. // try {
  57. // Log.e("----------- 重新请求接口 ------------");
  58. // /// 避免重复执行拦截器,使用tokenDio
  59. // var response = await _tokenDio.request(request.path,
  60. // data: request.data,
  61. // queryParameters: request.queryParameters,
  62. // cancelToken: request.cancelToken,
  63. // options: request,
  64. // onReceiveProgress: request.onReceiveProgress);
  65. // return response;
  66. // } on DioError catch (e) {
  67. // return e;
  68. // }
  69. // }}
  70. // }
  71. // return super.onResponse(response);
  72. // }
  73. //}
  74. class LoggingInterceptor extends Interceptor{
  75. DateTime startTime;
  76. DateTime endTime;
  77. @override
  78. onRequest(RequestOptions options) {
  79. startTime = DateTime.now();
  80. Log.d("----------Start----------");
  81. if (options.queryParameters.isEmpty){
  82. Log.d("RequestUrl: " + options.baseUrl + options.path);
  83. }else{
  84. Log.d("RequestUrl: " + options.baseUrl + options.path + "?" + Transformer.urlEncodeMap(options.queryParameters));
  85. }
  86. Log.d("RequestMethod: " + options.method);
  87. Log.d("RequestHeaders:" + options.headers.toString());
  88. Log.d("RequestContentType: ${options.contentType}");
  89. Log.d("RequestData: ${options.data.toString()}");
  90. return super.onRequest(options);
  91. }
  92. @override
  93. onResponse(Response response) {
  94. endTime = DateTime.now();
  95. int duration = endTime.difference(startTime).inMilliseconds;
  96. if (response.statusCode == ExceptionHandle.success){
  97. Log.d("ResponseCode: ${response.statusCode}");
  98. }else {
  99. Log.e("ResponseCode: ${response.statusCode}");
  100. }
  101. // 输出结果
  102. Log.json(response.data.toString());
  103. Log.d("----------End: $duration 毫秒----------");
  104. return super.onResponse(response);
  105. }
  106. @override
  107. onError(DioError err) {
  108. Log.d("----------Error-----------");
  109. return super.onError(err);
  110. }
  111. }
  112. class AdapterInterceptor extends Interceptor{
  113. static const String msg = "msg";
  114. static const String slash = "\"";
  115. static const String message = "message";
  116. static const String defaultText = "\"无返回信息\"";
  117. static const String notFound = "未找到查询信息";
  118. static const String failureFormat = "{\"code\":%d,\"message\":\"%s\"}";
  119. static const String successFormat = "{\"code\":0,\"data\":%s,\"message\":\"\"}";
  120. @override
  121. onResponse(Response response) {
  122. Response r = adapterData(response);
  123. return super.onResponse(r);
  124. }
  125. @override
  126. onError(DioError err) {
  127. if (err.response != null){
  128. adapterData(err.response);
  129. }
  130. return super.onError(err);
  131. }
  132. Response adapterData(Response response){
  133. String result;
  134. String content = response.data == null ? "" : response.data.toString();
  135. /// 成功时,直接格式化返回
  136. if (response.statusCode == ExceptionHandle.success || response.statusCode == ExceptionHandle.success_not_content){
  137. if (content == null || content.isEmpty){
  138. content = defaultText;
  139. }
  140. result = sprintf(successFormat, [content]);
  141. response.statusCode = ExceptionHandle.success;
  142. }else{
  143. if (response.statusCode == ExceptionHandle.not_found){
  144. /// 错误数据格式化后,按照成功数据返回
  145. result = sprintf(failureFormat, [response.statusCode, notFound]);
  146. response.statusCode = ExceptionHandle.success;
  147. }else {
  148. if (content == null || content.isEmpty){
  149. // 一般为网络断开等异常
  150. result = content;
  151. }else {
  152. String msg;
  153. try {
  154. content = content.replaceAll("\\", "");
  155. if (slash == content.substring(0, 1)){
  156. content = content.substring(1, content.length - 1);
  157. }
  158. Map<String, dynamic> map = json.decode(content);
  159. if (map.containsKey(message)){
  160. msg = map[message];
  161. }else if(map.containsKey(msg)){
  162. msg = map[msg];
  163. }else {
  164. msg = "未知异常";
  165. }
  166. result = sprintf(failureFormat, [response.statusCode, msg]);
  167. // 401 token失效时,单独处理,其他一律为成功
  168. if (response.statusCode == ExceptionHandle.unauthorized){
  169. response.statusCode = ExceptionHandle.unauthorized;
  170. }else {
  171. response.statusCode = ExceptionHandle.success;
  172. }
  173. } catch (e) {
  174. Log.d("异常信息:$e");
  175. // 解析异常直接按照返回原数据处理(一般为返回500,503 HTML页面代码)
  176. result = sprintf(failureFormat, [response.statusCode, "服务器异常(${response.statusCode})"]);
  177. }
  178. }
  179. }
  180. }
  181. response.data = result;
  182. return response;
  183. }
  184. }