api_provider.dart 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. import 'dart:io';
  2. import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
  3. import 'package:ftrecruiter/api/http_result.dart';
  4. import 'package:get/get.dart';
  5. import 'package:ftrecruiter/api/interceptors/auth_interceptor.dart';
  6. import 'package:ftrecruiter/api/interceptors/log_res_interceptor.dart';
  7. import 'package:ftrecruiter/api/interceptors/log_req_interceptor.dart';
  8. import 'package:ftrecruiter/comm/constants/api_constants.dart';
  9. import 'package:ftrecruiter/comm/constants/app_constant.dart';
  10. import '../comm/utils/log_utils.dart';
  11. typedef NetSuccessCallback<T> = Function(T data);
  12. typedef NetSuccessListCallback<T> = Function(T data);
  13. typedef NetErrorCallback = Function(int? code, String? msg);
  14. enum HttpMethod { GET, POST }
  15. /// 网络请求相关封装
  16. class ApiProvider extends GetConnect {
  17. /// 默认简单的请求封装,回调的方式
  18. Future<void> requestNetEasy(
  19. String url, {
  20. HttpMethod? method,
  21. Map<String, String>? headers,
  22. Map<String, dynamic>? query,
  23. Map<String, String>? paths,
  24. NetSuccessCallback<Map<String, dynamic>>? onSuccess,
  25. NetSuccessListCallback<List<dynamic>>? onSuccessList,
  26. NetErrorCallback? onError,
  27. }) async {
  28. //根据参数封装请求
  29. var req = generateRequest(method, query, paths, url, headers);
  30. //开始请求
  31. final startTime = DateTime.now().millisecond;
  32. var result = await req;
  33. final endTime = DateTime.now().millisecond;
  34. if (!AppConstant.inProduction) {
  35. final duration = endTime - startTime;
  36. Log.d('网络请求耗时 $duration 毫秒, 响应内容 ${result.body}}');
  37. }
  38. if (result.statusCode == 200) {
  39. //网络请求正确之后获取正常的Json-Map
  40. Map<String, dynamic> jsonMap = result.body;
  41. //查看apiCode是否正确
  42. int code = jsonMap['code'];
  43. if (code == 200) {
  44. if (jsonMap['data'] is List<dynamic>) {
  45. //返回数组
  46. List<dynamic> list = jsonMap['data'];
  47. if (onSuccessList != null) {
  48. onSuccessList(list);
  49. }
  50. } else {
  51. //返回对象
  52. if (onSuccess != null) {
  53. onSuccess(jsonMap['data']);
  54. }
  55. }
  56. } else {
  57. //Api错误
  58. if (onError != null) {
  59. onError(jsonMap['code'], jsonMap['message']);
  60. }
  61. }
  62. } else {
  63. //网络请求错误
  64. if (onError != null) {
  65. // result.bodyString 错误信息,这里没必要打印,拦截器中有打印的
  66. onError(result.statusCode, result.statusText);
  67. }
  68. //吐司网络请求错误
  69. SmartDialog.compatible.showToast("Request Network Error :${result.statusCode} ${result.statusText}");
  70. }
  71. }
  72. /// 网络请求异步的Result封装
  73. Future<HttpResult> requestNetResult(
  74. String url, {
  75. HttpMethod? method,
  76. Map<String, String>? headers,
  77. Map<String, dynamic>? query,
  78. Map<String, String>? paths,
  79. }) async {
  80. //根据参数封装请求
  81. var req = generateRequest(method, query, paths, url, headers);
  82. //开始请求
  83. final startTime = DateTime.now().millisecond;
  84. var result = await req;
  85. final endTime = DateTime.now().millisecond;
  86. if (!AppConstant.inProduction) {
  87. final duration = endTime - startTime;
  88. Log.d('网络请求耗时 $duration 毫秒, 响应内容 ${result.body}}');
  89. }
  90. if (result.statusCode == 200) {
  91. //网络请求正确之后获取正常的Json-Map
  92. Map<String, dynamic> jsonMap = result.body;
  93. //判断成功与失败
  94. int code = jsonMap['code'];
  95. if (code == 200) {
  96. if (jsonMap['data'] is List<dynamic>) {
  97. //成功->返回数组
  98. return HttpResult(isSuccess: true, listJson: jsonMap['data'],);
  99. } else {
  100. //成功->返回对象
  101. return HttpResult(isSuccess: true, dataJson: jsonMap['data']);
  102. }
  103. } else {
  104. //失败->返回Api错误
  105. return HttpResult(isSuccess: false, errorCode: jsonMap['code'], errorMsg: jsonMap['message']);
  106. }
  107. } else {
  108. //失败->返回网络请求错误
  109. return HttpResult(isSuccess: false, errorCode: result.statusCode, errorMsg: result.statusText);
  110. }
  111. }
  112. ///生成请求体
  113. Future<Response> generateRequest(HttpMethod? method, Map<String, dynamic>? query, Map<String, String>? paths,
  114. String url, Map<String, String>? headers) async {
  115. Future<Response> req;
  116. if (method != null && method == HttpMethod.POST) {
  117. var map = <String, dynamic>{};
  118. if (query != null || paths != null) {
  119. if (query != null) {
  120. map.addAll(query);
  121. }
  122. if (paths != null) {
  123. paths.forEach((key, value) {
  124. final file = File(value);
  125. map[key] = MultipartFile(
  126. file.readAsBytesSync(),
  127. filename: "file",
  128. );
  129. });
  130. }
  131. }
  132. var form = FormData(map);
  133. Log.d("Post请求FromData参数,fields:${form.fields.toString()} files:${form.files.toString()}");
  134. //以Post-Body的方式上传
  135. req = post(url, form, headers: headers);
  136. } else {
  137. //默认以Get-Params的方式上传
  138. req = get(url, headers: headers, query: query);
  139. }
  140. return req;
  141. }
  142. @override
  143. void onInit() {
  144. httpClient.baseUrl = ApiConstants.baseUrl;
  145. // httpClient.addResponseModifier(responseInterceptor);
  146. /// 统一添加身份验证请求头
  147. httpClient.addRequestModifier(authInterceptor);
  148. /// 打印Log(生产模式去除)
  149. if (!AppConstant.inProduction) {
  150. httpClient.addRequestModifier(logReqInterceptor);
  151. }
  152. /// 打印Log(生产模式去除)
  153. // if (!AppConstant.inProduction) {
  154. // httpClient.addResponseModifier(logResInterceptor);
  155. // }
  156. }
  157. }