api_provider.dart 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import 'dart:io';
  2. import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
  3. import 'package:get/get.dart';
  4. import 'package:ftrecruiter/api/interceptors/auth_interceptor.dart';
  5. import 'package:ftrecruiter/api/interceptors/log_res_interceptor.dart';
  6. import 'package:ftrecruiter/api/interceptors/log_req_interceptor.dart';
  7. import 'package:ftrecruiter/comm/constants/api_constants.dart';
  8. import 'package:ftrecruiter/comm/constants/app_constant.dart';
  9. import '../comm/utils/log_utils.dart';
  10. typedef NetSuccessCallback<T> = Function(T data);
  11. typedef NetSuccessListCallback<T> = Function(T data);
  12. typedef NetErrorCallback = Function(int? code, String? msg);
  13. enum HttpMethod { GET, POST }
  14. //基类的Api封装
  15. class ApiProvider extends GetConnect {
  16. //Get请求封装
  17. Future<void> requestNetwork(
  18. String url, {
  19. HttpMethod? method,
  20. Map<String, String>? headers,
  21. Map<String, dynamic>? query, //请求参数
  22. Map<String, File>? paths, //文件上传
  23. NetSuccessCallback<Map<String, dynamic>>? onSuccess, //data数据成功回调
  24. NetSuccessListCallback<List<dynamic>>? onSuccessList, //List数据成功回调
  25. NetErrorCallback? onError,
  26. }) async {
  27. //封装参数
  28. Future<Response> req;
  29. if (method != null && method == HttpMethod.POST) {
  30. var map = <String, dynamic>{};
  31. if (query != null || paths != null) {
  32. if (query != null) {
  33. map.addAll(query);
  34. }
  35. if (paths != null) {
  36. paths.forEach((key, value) {
  37. map[key] = MultipartFile(
  38. value.readAsBytesSync(),
  39. filename: "file",
  40. );
  41. });
  42. }
  43. }
  44. var form = FormData(map);
  45. Log.d("Post请求FromData参数,fields:${form.fields.toString()}");
  46. //以Post-Body的方式上传
  47. req = post(url, form, headers: headers);
  48. } else {
  49. //以Get-Params的方式上传
  50. req = get(url, headers: headers, query: query);
  51. }
  52. //开始真正请求
  53. final startTime = DateTime.now().millisecond;
  54. var result = await req;
  55. final endTime = DateTime.now().millisecond;
  56. if (!AppConstant.inProduction) {
  57. final duration = endTime - startTime;
  58. Log.d('网络请求耗时 $duration 毫秒, 响应内容 ${result.body}}');
  59. }
  60. if (result.statusCode == 200) {
  61. //网络请求正确之后获取正常的Json-Map
  62. Map<String, dynamic> jsonMap = result.body;
  63. //查看apiCode是否正确
  64. int code = jsonMap['code'];
  65. if (code == 200) {
  66. if (jsonMap['data'] is List<dynamic>) {
  67. //返回数组
  68. List<dynamic> list = jsonMap['data'];
  69. if (onSuccessList != null) {
  70. onSuccessList(list);
  71. }
  72. } else {
  73. //返回对象
  74. if (onSuccess != null) {
  75. onSuccess(jsonMap['data']);
  76. }
  77. }
  78. } else {
  79. //Api错误
  80. if (onError != null) {
  81. onError(jsonMap['code'], jsonMap['message']);
  82. }
  83. }
  84. } else {
  85. //网络请求错误
  86. if (onError != null) {
  87. // result.bodyString 错误信息,这里没必要打印,拦截器中有打印的
  88. onError(result.statusCode, result.statusText);
  89. }
  90. //吐司网络请求错误
  91. SmartDialog.compatible
  92. .showToast("Request Network Error :${result.statusCode} ${result.statusText}");
  93. }
  94. }
  95. @override
  96. void onInit() {
  97. httpClient.baseUrl = ApiConstants.baseUrl;
  98. // httpClient.addResponseModifier(responseInterceptor);
  99. /// 统一添加身份验证请求头
  100. httpClient.addRequestModifier(authInterceptor);
  101. /// 打印Log(生产模式去除)
  102. if (!AppConstant.inProduction) {
  103. httpClient.addRequestModifier(logReqInterceptor);
  104. }
  105. /// 打印Log(生产模式去除)
  106. // if (!AppConstant.inProduction) {
  107. // httpClient.addResponseModifier(logResInterceptor);
  108. // }
  109. }
  110. }