request<T> method
Future
request<T>(
- RequestType method,
- String path, {
- String? host,
- JJResponseType jjResponseType = JJResponseType.jsonObj,
- Map<
String, dynamic> ? params, - String? auth,
- required dynamic onSuccess(
- dynamic
- dynamic onError()?,
- dynamic onStart()?,
- dynamic onFinish()?,
- dynamic onMessage(
- String msg
- Duration? timeout,
- bool errorToast = true,
- bool pathConfuseEnabled = true,
- bool encryptDataEnabled = true,
- 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();
}
}
}