intercept.dart 6.6 KB

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