callApi method
Implementation
Future<http.Response> callApi(
{required String? endpoint,
required String? method,
Map<String, dynamic> body = const {},
File? file,
int? page,
int? perPage,
bool? isSinaAPI = false}) async {
final token = AltibbiService.authToken;
final baseURL = isSinaAPI == true ? AltibbiService.sinaModelEndPointUrl : AltibbiService.url;
final lang = AltibbiService.lang;
if (token == null) {
throw Exception('Token is missing or invalid.');
}
final headers = {
'Content-Type': 'application/json; charset=utf-8',
'accept-language': lang!
};
String? encodedBody;
Map<String, dynamic> requestBody = Map<String, dynamic>.from(body);
if (isSinaAPI == true) {
headers['partner-host'] = AltibbiService.url!;
headers['partner-user-token'] = token;
} else {
headers['Authorization'] = 'Bearer ${token}';
}
if (requestBody.isNotEmpty) {
encodedBody = json.encode(requestBody);
_log('\n========== REQUEST BODY ==========');
_log(encodedBody);
_log('==================================\n');
}
Uri url;
if (method == 'get') {
final queryParameters = Map.fromEntries(requestBody.entries
.map((entry) => MapEntry(entry.key, entry.value.toString())));
if (perPage != null && page != null) {
queryParameters['per-page'] = perPage.toString();
queryParameters['page'] = page.toString();
}
url = Uri.parse(baseURL!.contains("rest-api") ? baseURL : (isSinaAPI == true ? '$baseURL/$endpoint' : '$baseURL/v1/$endpoint'))
.replace(queryParameters: queryParameters);
} else {
url = Uri.parse(baseURL!.contains("rest-api") ? baseURL : (isSinaAPI == true ? '$baseURL/$endpoint' : '$baseURL/v1/$endpoint'));
if (method == 'post' && requestBody.containsKey('expand')) {
final expand = requestBody['expand'];
url = url.replace(queryParameters: {'expand': expand});
}
}
// Generate and print curl command
final curlCommand = _generateCurlCommand(
method: method!,
url: url,
headers: headers,
body: encodedBody,
file: file,
);
_log('\n========== CURL COMMAND ==========');
final maxChunkSize = 800;
if (curlCommand.length <= maxChunkSize) {
_log(curlCommand);
} else {
for (int i = 0; i < curlCommand.length; i += maxChunkSize) {
final end = (i + maxChunkSize < curlCommand.length) ? i + maxChunkSize : curlCommand.length;
_log(curlCommand.substring(i, end));
}
}
_log('==================================\n');
http.Response response;
if (file != null) {
var request = http.MultipartRequest('POST', url);
request.headers.addAll(headers);
request.files.add(await http.MultipartFile.fromPath('file', file.path));
var streamedResponse = await request.send();
response = await http.Response.fromStream(streamedResponse);
} else {
switch (method) {
case 'get':
response = await http.get(url, headers: headers);
break;
case 'post':
response = await http.post(url, headers: headers, body: encodedBody);
break;
case 'put':
response = await http.put(url, headers: headers, body: encodedBody);
break;
case 'delete':
response = await http.delete(url, headers: headers, body: encodedBody);
break;
default:
throw Exception('Invalid method type: $method');
}
}
_log('\n========== RESPONSE ==========');
_log('Status Code: ${response.statusCode}');
_log('Headers: ${response.headers}');
_log('Body: ${response.body}');
_log('==============================\n');
return response;
}