import 'dart:convert'; import 'dart:io'; import 'package:comunic/models/api_request.dart'; import 'package:comunic/models/api_response.dart'; import 'package:comunic/models/config.dart'; /// API Helper /// /// @author Pierre HUBERT class APIHelper { final _httpClient = HttpClient(); /// Execute a [request] on the server and returns a [APIResponse] /// /// This method should never throw but the response code of the [APIResponse] /// should be verified before accessing response content Future exec(APIRequest request) async { try { //Add API tokens request.addString("serviceName", config().serviceName); request.addString("serviceToken", config().serviceToken); //Add user tokens (if required) if (request.needLogin) throw "Can add user tokens right now !"; // Prepare request body String requestBody = ""; request.args.forEach((key, value) => requestBody += Uri.encodeQueryComponent(key) + "=" + Uri.encodeQueryComponent(value) + "&"); List bodyBytes = utf8.encode(requestBody); // Determine server URL final path = config().apiServerUri + request.uri; Uri url; if (!config().apiServerSecure) url = Uri.http(config().apiServerName, path); else url = Uri.https(config().apiServerName, path); //Connect to server final connection = await _httpClient.postUrl(url); connection.headers.set("Content-Length", bodyBytes.length.toString()); connection.headers .set("Content-Type", "application/x-www-form-urlencoded"); connection.add(bodyBytes); final response = await connection.close(); if (response.statusCode != HttpStatus.ok) return APIResponse(response.statusCode, null); //Save & return response final responseBody = await response.transform(utf8.decoder).join(); return APIResponse(response.statusCode, responseBody); } on Exception catch (e) { print(e.toString()); print("Could not execute a request!"); return APIResponse(-1, null); } } }