request<T extends Ret> method

Future<ApiResponse<T>> request<T extends Ret>({
  1. required String path,
  2. required String prefix,
  3. T? fromJson(
    1. Map<String, dynamic>?
    )?,
  4. Method method = Method.get,
  5. dynamic body,
  6. Map<String, String>? headers,
  7. dynamic onRespHeader(
    1. Map<String, String>
    )?,
  8. Duration timeOut = const Duration(seconds: 20),
})

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"));
  }
}