request<T> method

Future request<T>(
  1. RequestType method,
  2. String path, {
  3. String? host,
  4. JJResponseType jjResponseType = JJResponseType.jsonObj,
  5. Map<String, dynamic>? params,
  6. String? auth,
  7. required dynamic onSuccess(
    1. dynamic
    ),
  8. dynamic onError(
    1. ErrorEntity
    )?,
  9. dynamic onStart()?,
  10. dynamic onFinish()?,
  11. dynamic onMessage(
    1. String msg
    )?,
  12. Duration? timeout,
  13. bool errorToast = true,
  14. bool pathConfuseEnabled = true,
  15. bool encryptDataEnabled = true,
  16. CancelToken? cancel,
})

请求,返回参数为 Map 或 List method请求类型 RequestType path请求地址 host请求域名(可选:如果传递则走传递的域名) jjResponseType接口返回的data类型JJResponseType(JSON对象/JSON数组) params请求参数 onSuccess请求成功回调 onError请求失败回调 onStart发起请求前回调 onFinish请求完成回调(不论请求失败与否) auth允许指定auth,主要用于在直播间时账号被挤下线的处理 errorToast是否显示Toast提示(默认显示) pathConfuseEnabled path路径混淆 (默认启用) encryptDataEnabled 是否启用加密 (默认启用) tag 用于取消接口

Implementation

Future request<T>(RequestType method, String path,
    {String? host,
    JJResponseType jjResponseType = JJResponseType.jsonObj,
    Map<String, dynamic>? params,
    String? auth,
    required Function(dynamic) onSuccess,
    Function(ErrorEntity)? onError,
    Function()? onStart,
    Function()? onFinish,
    Function(String msg)? onMessage,
    Duration? timeout,
    bool errorToast = true,
    bool pathConfuseEnabled = true,
    bool encryptDataEnabled = true,
    CancelToken? cancel}) async {
  String logTag = _isDebugMode() ? DateTime.now().millisecondsSinceEpoch.toString() : "";
  String requestUrl = "";
  String logRequestUrl = ""; // 仅用于LOG显示
  final useCustomHost = !TextUtils.isEmpty(host);
  try {
    if (null != onStart) {
      onStart();
    }
    Response response;
    String encodePath = pathConfuseEnabled ? EncryptUtils.encodeApiPath(path) : path;
    if (useCustomHost) {
      requestUrl = host! + encodePath;
      logRequestUrl = host + path;
    } else {
      String domainHost = DomainManager().getDomain(DomainType.server);
      requestUrl = domainHost + encodePath;
      logRequestUrl = domainHost + path;
    }
    if (RequestType.POST == method) {
      params ??= {};
      String requestJson = json.encode(params);
      _logRequest(logTag, logRequestUrl, requestJson);
      response = await _dio!.request(requestUrl,
          data: encryptDataEnabled ? EncryptUtils.xorCodeForJJ(requestJson) : requestJson,
          options: Options(
              method: requestTypeValues[method],
              headers: getAuthorizationHeader(path, params, auth),
              sendTimeout: timeout,
              receiveTimeout: timeout),
          cancelToken: cancel);
    } else {
      // GET请求参数目前没加密(当前项目没用到GET请求)
      response = await _dio!.request(requestUrl,
          queryParameters: params,
          options: Options(
              method: requestTypeValues[method],
              headers: getAuthorizationHeader(path, params, auth),
              sendTimeout: timeout,
              receiveTimeout: timeout),
          cancelToken: cancel);
    }
    String decryptData = (encryptDataEnabled ? EncryptUtils.xorCodeForJJ(response.data ?? "") : response.data) ?? "";
    _logResponse(logTag, logRequestUrl, decryptData);

    int responseCode;
    String responseMsg;
    T? objData;
    List<T>? arrayData;
    if (JJResponseType.jsonArray == jjResponseType) {
      BaseListEntity<T> entity = BaseListEntity<T>.fromJson(json.decode(decryptData));
      responseCode = entity.code;
      responseMsg = entity.msg;
      arrayData = entity.data;
    } else if (JJResponseType.jsonObj == jjResponseType) {
      BaseEntity<T> entity = BaseEntity<T>.fromJson(json.decode(decryptData));
      responseCode = entity.code;
      responseMsg = entity.msg;
      objData = entity.data;
    } else {
      // custom 交给调用层处理特定的response
      responseCode = 0;
      responseMsg = "success";
    }
    if (HttpCode.success == responseCode) {
      if (!useCustomHost) {
        _setRequestSuccess();
      }
      if (JJResponseType.jsonArray == jjResponseType) {
        onSuccess(arrayData);
      } else if (JJResponseType.jsonObj == jjResponseType) {
        onSuccess(objData);
      } else {
        // 直接返回原始的response.data给上层处理
        onSuccess(decryptData);
      }
      onMessage?.call(responseMsg);
      return JJResponseType.jsonArray == jjResponseType ? arrayData : objData;
    } else if (HttpCode.reLogin == responseCode) {
      _dealWithMultiDeviceLogin(responseMsg, onError);
    } else if (HttpCode.tokenExpired == responseCode) {
      _dealWithTokenExpired();
    } else {
      if (!useCustomHost) {
        _setRequestError();
      }
      ErrorEntity error = ErrorEntity(code: responseCode, message: responseMsg);
      showErrorToast(error, errorToast);
      if (null != onError) {
        onError(error);
      }
      onMessage?.call(error.message);
      return error;
    }
  } on Exception catch (e) {
    if (!useCustomHost) {
      _setRequestError();
    }
    _logError(logTag, logRequestUrl, e);
    ErrorEntity error = createErrorEntity(e);
    showErrorToast(error, errorToast);
    if (null != onError) {
      onError(error);
    }
    onMessage?.call(error.message);
    return error;
  } finally {
    if (null != onFinish) {
      onFinish();
    }
  }
}