request method Null safety

Future<SMHResponse<T>?> request(
  1. List<String> paths,
  2. {String? urlMethod,
  3. Map<String, dynamic>? header,
  4. Map<String, dynamic>? query,
  5. dynamic body,
  6. CancelToken? cancelToken,
  7. ProgressCallback? onSendProgress,
  8. ProgressCallback? onReceiveProgress,
  9. SMHFinishCalBack<T>? finishCallback}
)

Implementation

Future<SMHResponse<T>?> request(
  List<String> paths, {
  String? urlMethod,
  Map<String, dynamic>? header,
  Map<String, dynamic>? query,
  dynamic body,
  CancelToken? cancelToken,
  ProgressCallback? onSendProgress,
  ProgressCallback? onReceiveProgress,
  SMHFinishCalBack<T>? finishCallback,
}) async {
  String serviceName = getServiceName();
  DateTime startTime = DateTime.now();
  Map<String, String> reportParams = {};

  SMHService service;
  if (SMHServicesManager.servicesManager.serviceMap
      .containsKey(serviceKey())) {
    service = SMHServicesManager.servicesManager.serviceMap[serviceKey()]!;
  } else {
    SMHError smhError = SMHError();
    smhError.smhCode = 'ServiceNoRegister';
    smhError.smhMessage = serviceKey() + " no register";
    smhError.smhZhMessage = serviceKey() + " 没有注册";
    throw (smhError);
  }
  Dio dio = service.dio;

  Map<String, dynamic> headerParams = {};
  if (service.serviceHeader() != null) {
    headerParams.addAll(service.serviceHeader()!);
  }
  if (header != null) {
    headerParams.addAll(header);
  }

  Map<String, dynamic> queryParams = {};
  if (service.serviceQuery() != null) {
    queryParams.addAll(service.serviceQuery()!);
  }
  if (query != null) {
    queryParams.addAll(query);
  }
  Map<String, dynamic> tempQuery = {};
  queryParams.keys.forEach((e) {
    dynamic value = queryParams[e];
    tempQuery.addKeyWithObject(e, value);
  });
  queryParams = tempQuery;

  List urlPaths = [];
  if (service.urlPaths() != null) {
    urlPaths.addAll(service.urlPaths()!);
  }

  if (path() != null) {
    urlPaths.add(path());
  }

  urlPaths.addAll(paths);

  String url = urlPaths.join('/');
  String? urlM;
  if (urlMethod != null) {
    urlM = urlMethod;
  } else {
    urlM = URLMethod();
  }

  if (urlM != null) {
    url += '?$urlM';
  }

  Options options = Options(headers: headerParams);
  Future responseFurure;
  try {
    switch (method()) {
      case RequestMethod.get:
        {
          responseFurure = dio.get(url,
              queryParameters: queryParams,
              options: options,
              onReceiveProgress: onReceiveProgress);
        }
        break;
      case RequestMethod.post:
        {
          responseFurure = dio.post(url,
              data: body,
              queryParameters: queryParams,
              options: options,
              onReceiveProgress: onReceiveProgress,
              onSendProgress: onSendProgress);
        }
        break;
      case RequestMethod.put:
        {
          responseFurure = dio.put(url,
              data: body,
              queryParameters: queryParams,
              options: options,
              onReceiveProgress: onReceiveProgress,
              onSendProgress: onSendProgress);
        }
        break;
      case RequestMethod.delete:
        {
          responseFurure = dio.delete(url,
              data: body, queryParameters: queryParams, options: options);
        }
        break;
      case RequestMethod.patch:
        {
          responseFurure = dio.patch(url,
              data: body, queryParameters: queryParams, options: options);
        }
        break;
      case RequestMethod.head:
        {
          responseFurure = dio.head(url,
              data: body, queryParameters: queryParams, options: options);
        }
        break;
    }

    Response response = await responseFurure;

    dynamic dataMap = service.responseFactory(response);
    SMHResponse<T> smhResponse = SMHResponse<T>.fromJson(dataMap);
    smhResponse.headers = response.headers;
    if (Isolate.current.debugName == 'main') {
      reportParams['host'] = service.baseUrl;
      reportParams['smh_key'] =
          service.baseUrl + url + ':query:' + queryParams.toString();
      for (String item in urlPaths) {
        if (item.startsWith('space')) {
          reportParams['space_id'] = item;
          break;
        }
      }

      reportParams['name'] = serviceName;
      Future(() =>
          {SMHBeaconManager.manager.reportSuccess(params: reportParams)});
    }

    if (finishCallback != null) {
      finishCallback(smhResponse, null);
    } else {
      return smhResponse;
    }
  } on DioError catch (e) {
    SMHError smhError = service.errorFactory(e);
    if (Isolate.current.debugName == 'main') {
      reportParams['error_service_name'] = serviceName;
      reportParams['error_status_code'] = smhError.statusCode.toString();
      reportParams['error_message'] = smhError.statusMessage.toString() +
          ':' +
          smhError.smhMessage.toString();
      reportParams['error_code'] = smhError.smhCode.toString();
      reportParams['error_type'] = smhError.error.toString();
      reportParams['took_time'] =
          DateTime.now().difference(startTime).inMilliseconds.toString();
      reportParams['cos_request_id'] = smhError.cosRequestId ?? '';
      reportParams['request_id'] = smhError.requestId ?? '';
      SMHBeaconManager.manager.reportFail(params: reportParams);
    }
    if (finishCallback != null) {
      finishCallback(null, smhError);
    } else {
      throw (smhError);
    }
  } catch (e) {
    SMHError smhError = SMHError();
    smhError.error = e;
    if (Isolate.current.debugName == 'main') {
      reportParams['error_service_name'] = serviceName;
      reportParams['error_status_code'] = e.toString();
      reportParams['error_message'] = e.toString();
      reportParams['error_code'] = e.toString();
      reportParams['error_type'] = e.toString();
      reportParams['took_time'] =
          DateTime.now().difference(startTime).inMilliseconds.toString();
      reportParams['cos_request_id'] = smhError.cosRequestId ?? '';
      reportParams['request_id'] = smhError.requestId ?? '';
      SMHBeaconManager.manager.reportFail(params: reportParams);
    }
    if (finishCallback != null) {
      finishCallback(null, smhError);
    } else {
      throw (smhError);
    }
  }
}