httpRequest method
发起AES加密通讯的http请求
Implementation
Future<EasyPacket> httpRequest(String route, {Map<String, dynamic>? data, List<List<int>>? fileBytes, MediaType? mediaType, Map<String, String>? headers}) async {
final requestId = _reqIdInc++;
final requestPacket = EasyPacket.request(route: route, id: requestId, desc: DateTime.now().millisecondsSinceEpoch.toString(), data: data);
final requestData = threadEnable
? await _thread!.runTask(
taskType: _threadTaskEncrypt,
taskData: [requestPacket, _token ?? _config.pwd, _config.binary],
)
: EasySecurity.encrypt(requestPacket, _token ?? _config.pwd, _config.binary);
if (requestData == null) {
final responsePacket = requestPacket.requestEncryptError();
logError(['httpRequest =>', responsePacket.codeDesc, requestPacket]);
return responsePacket;
}
logDebug(['httpRequest >>>>>>', requestPacket]);
logTrace(['httpRequest =>', requestData]);
try {
int fieldId = 0;
final url = Uri.parse('${_config.httpUrl}$route');
final response = fileBytes == null || mediaType == null
? await http.post(url, body: requestData, headers: {'content-type': _config.binary ? 'application/octet-stream' : 'text/plain', 'easy-security-identity': _uid ?? ''}..addAll(headers ?? {}))
: await http.Response.fromStream(await (http.MultipartRequest('POST', url)
..headers.addAll({'easy-security-identity': _uid ?? ''})
..files.add(_config.binary ? http.MultipartFile.fromBytes('data', requestData) : http.MultipartFile.fromString('data', requestData))
..files.addAll(fileBytes.map((bytes) => http.MultipartFile.fromBytes('file_${fieldId++}', bytes, contentType: mediaType))))
.send());
logTrace(['httpResponse <=', response.headers]);
final responseBody = _config.binary ? response.bodyBytes : response.body;
logTrace(['httpResponse <=', responseBody]);
if (response.statusCode != 200) {
final responsePacket = requestPacket.requestStatusCodeError(status: response.statusCode, reason: response.reasonPhrase);
logError(['httpResponse <<<<<<', responsePacket]);
return responsePacket;
}
final responseData = threadEnable
? await _thread!.runTask<EasyPacket>(
taskType: _threadTaskDecrypt,
taskData: [responseBody, _token ?? _config.pwd],
)
: EasySecurity.decrypt(responseBody, _token ?? _config.pwd);
if (responseData == null) {
final responsePacket = requestPacket.requestDecryptError();
logError(['httpResponse <<<<<<', responsePacket]);
return responsePacket;
}
if (responseData.ok) {
logDebug(['httpResponse <<<<<<', responseData]);
} else {
logError(['httpResponse <<<<<<', responseData]);
}
return responseData;
} catch (error, stack) {
final responsePacket = requestPacket.requestExceptionError(error: error);
logError(['httpResponse <<<<<<', responsePacket, error, '\n', stack]);
return responsePacket;
}
}