request<T extends Ret> method
Http requester
Implementation
Future<ApiResponse<T>> request<T extends Ret>({
required String path,
required String prefix,
T? Function(Map<String, dynamic>?)? fromJson,
Method method = Method.get,
dynamic body,
Map<String, String>? headers,
Function(Map<String, String>)? onRespHeader,
Duration timeOut = const Duration(seconds: 20),
}) async {
StringBuffer logBuff = StringBuffer();
DateTime startTime = DateTime.now();
logBuff.writeln("==========================================================================>");
logBuff.writeln("== ********** ${prefix.toUpperCase()} START **********");
http.Response response;
bool initType = await _storage.dtbInitType;
Uri uri = Uri.https(utf8.decode(base64.decode(initType ? host : devHost)), path);
try {
Map<String, String> reqHeaders = headers ?? await buildAuthHeader();
PackageInfo p = await PackageInfo.fromPlatform();
String userAgent;
if (Platform.isAndroid) {
final deviceData = await DeviceInfoPlugin().androidInfo;
final model = deviceData.model;
final brand = deviceData.brand;
final sdk = "${deviceData.version.sdkInt}";
final release = deviceData.version.release;
final deviceName = (await DeviceMarketingNames().getSingleName()).replaceAll(" ", "_");
userAgent =
"DtbLink/${p.version}.${p.buildNumber}(${Platform.operatingSystem}_$release(SDK_$sdk)/$model)/$brand/$deviceName";
} else {
final deviceData = await DeviceInfoPlugin().iosInfo;
final brand = deviceData.name;
final systemName = deviceData.systemName;
final systemVersion = deviceData.systemVersion;
final release = deviceData.utsname.release;
final deviceName = (await DeviceMarketingNames().getSingleName()).replaceAll(" ", "_");
userAgent = "DtbLink/${p.version}.${p.buildNumber}($systemName($systemVersion)/$release)/$brand/$deviceName";
}
reqHeaders.putIfAbsent(HttpHeaders.userAgentHeader, () => userAgent);
if (method == Method.get) {
logBuff.writeln("== GET: $uri");
logBuff.writeln("$reqHeaders");
response = await http.get(uri, headers: reqHeaders).timeout(timeOut);
} else {
logBuff.writeln("== POST: $uri");
logBuff.writeln("$reqHeaders");
logBuff.writeln("== body: $body");
response = await http
.post(uri, body: body, headers: reqHeaders, encoding: Encoding.getByName("utf-8"))
.timeout(timeOut);
}
String resp = utf8.decode(response.bodyBytes);
logBuff.writeln("== resp: $resp");
String terminal = String.fromCharCodes(resp.codeUnits);
logBuff.writeln("== $terminal");
Map<String, dynamic> respMap = json.decode(resp);
final String statusCode = respMap["status_code"];
logBuff.writeln("== statusCode: $statusCode");
logBuff.writeln(
"== ********** ${prefix.toUpperCase()} FINISH : ${response.statusCode} : ${DateTime.now().difference(startTime).inMilliseconds} **********");
logBuff.write("<==========================================================================");
_log(logBuff.toString());
if (response.statusCode == HttpStatus.ok && statusCode == "ok") {
onRespHeader?.call(response.headers);
if (fromJson != null) {
final tResp = ApiResponse.fromJson<T>(json.decode(resp), (Map<String, dynamic>? json) {
// _log("resp: $json");
return fromJson(json);
});
return tResp;
} else {
return ApiResponse(statusCode: statusCode, msg: Msg.fromJson(respMap["msg"]));
}
} else {
return ApiResponse(
statusCode: "ng",
msg: Msg.fromJson(respMap["msg"]),
);
}
} on TimeoutException {
logBuff.write("\nTimeoutException");
_log(logBuff.toString());
return ApiResponse(statusCode: "ng", msg: Msg(code: "396", body: "Сервер хариу өгсөнгүй"));
} on SocketException catch (_) {
logBuff.write("\nSocketException");
_log(logBuff.toString());
_log(logBuff.toString());
return ApiResponse(statusCode: "ng", msg: Msg(code: "300", body: "No Internet connection"));
} on Exception catch (e) {
logBuff.write("\nException: ${e.toString()}");
_log(logBuff.toString());
return ApiResponse(statusCode: "ng", msg: Msg(code: "005", body: "$e"));
} on Error catch (e) {
logBuff.write("\nError: ${e.stackTrace}");
_log(logBuff.toString());
return ApiResponse(statusCode: "ng", msg: Msg(code: "error", body: "$e"));
}
}