import 'dart:convert'; import 'dart:io'; import 'package:device_info/device_info.dart'; import 'package:dio/dio.dart'; import 'package:fcs/domain/vo/status.dart'; import 'package:logging/logging.dart'; import '../config.dart'; import 'dev_info.dart'; final log = Logger('requestAPI'); // request makes http request // if token is null Future requestAPI( String path, method, { dynamic payload, String token, String url, }) async { DevInfo devInfo = await DevInfo.getDevInfo(); String deviceName = "${devInfo.model}(${devInfo.id})"; log.info("device:${devInfo.deviceID},deviceName:$deviceName"); Map headers = {}; if (token != null) { headers["Token"] = token; } if (devInfo != null && devInfo.deviceID != null && deviceName != null) { headers["Device"] = devInfo.deviceID + ":" + deviceName; } headers["Project-ID"] = Config.instance.reportProjectID; BaseOptions options = new BaseOptions( method: method, baseUrl: url == null ? Config.instance.apiURL : url, connectTimeout: 10000, receiveTimeout: 10000, headers: headers, ); log.info("baseUrl:${options.baseUrl}, path:$path"); try { Dio dio = new Dio(options); Response response = await dio.request( path, data: payload, ); var data = Status.fromJson(response.data); if (data.status == 'Ok') { return response.data["data"]; } else { throw Exception(data.message); } } catch (e) { log.warning("path:$path, api:$e"); throw e; } } // request makes http request // if token is null Future requestDownloadAPI(String path, method, {dynamic payload, String token, String url, String filePath}) async { DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; String deviceName = "${androidInfo.model}(${androidInfo.id})"; log.info("device:${androidInfo.androidId},deviceName:$deviceName"); var bytes = utf8.encode(payload); var base64Str = base64.encode(bytes); String escapePayload = HtmlEscape().convert(base64Str); try { String baseUrl = url == null ? Config.instance.apiURL : url; log.info("Path:$baseUrl$path"); HttpClient client = new HttpClient(); var _downloadData = StringBuffer(); var fileSave = new File(filePath); var request = await client.getUrl(Uri.parse("$baseUrl$path")); request.headers.set("Project-ID", Config.instance.reportProjectID); request.headers .set(HttpHeaders.contentTypeHeader, "application/json; charset=UTF-8"); if (token != null) { request.headers.set("Token", token); } if (androidInfo.androidId != null) { request.headers.set("Device", androidInfo.androidId + ":" + deviceName); } request.headers.set("payload", escapePayload); var response = await request.close(); print("headers:${response.headers}"); response.transform(utf8.decoder).listen((d) => _downloadData.write(d), onDone: () { fileSave.writeAsString(_downloadData.toString()); }); } catch (e) { log.warning("path:$path, api:$e"); throw e; } } // request makes http request // if token is null Future requestDownloadPDFAPI(String path, method, {dynamic payload, String token, String url, String filePath}) async { DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; String deviceName = "${androidInfo.model}(${androidInfo.id})"; log.info("device:${androidInfo.androidId},deviceName:$deviceName"); var bytes = utf8.encode(payload); var base64Str = base64.encode(bytes); String escapePayload = HtmlEscape().convert(base64Str); try { String baseUrl = url == null ? Config.instance.apiURL : url; log.info("Path:$baseUrl$path"); HttpClient client = new HttpClient(); // var _downloadData = StringBuffer(); var fileSave = new File(filePath); var request = await client.getUrl(Uri.parse("$baseUrl$path")); request.headers.set("Project-ID", Config.instance.reportProjectID); if (token != null) { request.headers.set("Token", token); } if (androidInfo.androidId != null) { request.headers.set("Device", androidInfo.androidId + ":" + deviceName); } request.headers.set("payload", escapePayload); var response = await request.close(); print("headers:${response.headers}"); var _downloadData = List(); response.listen((d) => _downloadData.addAll(d), onDone: () { fileSave.writeAsBytes(_downloadData); }); // response.transform(utf8.decoder).listen((d) => _downloadData.write(d), // onDone: () { // fileSave.writeAsString(_downloadData.toString()); // }); } catch (e) { log.warning("path:$path, api:$e"); throw e; } }