|
|
|
@ -18,7 +18,8 @@ class APIError {
|
|
|
|
|
|
|
|
|
|
APIError(this.errorCode, this.errorMessage);
|
|
|
|
|
|
|
|
|
|
Map<String, dynamic> toJson() => {'errorCode': errorCode, 'errorMessage': errorMessage};
|
|
|
|
|
Map<String, dynamic> toJson() =>
|
|
|
|
|
{'errorCode': errorCode, 'errorMessage': errorMessage};
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
String toString() {
|
|
|
|
@ -53,7 +54,8 @@ APIException _throwAPIException(Response response) {
|
|
|
|
|
return APIException(APIException.INTERNAL_SERVER_ERROR);
|
|
|
|
|
case 444:
|
|
|
|
|
var downloadUrl = response.headers["location"];
|
|
|
|
|
return APIException(APIException.UPGRADE_REQUIRED, arguments: downloadUrl);
|
|
|
|
|
return APIException(APIException.UPGRADE_REQUIRED,
|
|
|
|
|
arguments: downloadUrl);
|
|
|
|
|
default:
|
|
|
|
|
return APIException(APIException.OTHER);
|
|
|
|
|
}
|
|
|
|
@ -66,8 +68,13 @@ class ApiClient {
|
|
|
|
|
|
|
|
|
|
factory ApiClient() => _instance;
|
|
|
|
|
|
|
|
|
|
Future<U> postJsonForObject<T, U>(FactoryConstructor<U> factoryConstructor, String url, T jsonObject,
|
|
|
|
|
{String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0, bool isFormData = false}) async {
|
|
|
|
|
Future<U> postJsonForObject<T, U>(
|
|
|
|
|
FactoryConstructor<U> factoryConstructor, String url, T jsonObject,
|
|
|
|
|
{String? token,
|
|
|
|
|
Map<String, dynamic>? queryParameters,
|
|
|
|
|
Map<String, String>? headers,
|
|
|
|
|
int retryTimes = 0,
|
|
|
|
|
bool isFormData = false}) async {
|
|
|
|
|
var _headers = {'Accept': 'application/json'};
|
|
|
|
|
if (headers != null && headers.isNotEmpty) {
|
|
|
|
|
_headers.addAll(headers);
|
|
|
|
@ -77,7 +84,12 @@ class ApiClient {
|
|
|
|
|
var bodyJson = json.encode(jsonObject);
|
|
|
|
|
print("body:$bodyJson");
|
|
|
|
|
}
|
|
|
|
|
var response = await postJsonForResponse(url, jsonObject, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes, isFormData: isFormData);
|
|
|
|
|
var response = await postJsonForResponse(url, jsonObject,
|
|
|
|
|
token: token,
|
|
|
|
|
queryParameters: queryParameters,
|
|
|
|
|
headers: _headers,
|
|
|
|
|
retryTimes: retryTimes,
|
|
|
|
|
isFormData: isFormData);
|
|
|
|
|
// try {
|
|
|
|
|
if (!kReleaseMode) {
|
|
|
|
|
logger.i("res: " + response.body);
|
|
|
|
@ -90,7 +102,8 @@ class ApiClient {
|
|
|
|
|
return factoryConstructor(jsonData);
|
|
|
|
|
} else {
|
|
|
|
|
APIError? apiError;
|
|
|
|
|
apiError = APIError(jsonData['ErrorCode'], jsonData['ErrorEndUserMessage']);
|
|
|
|
|
apiError =
|
|
|
|
|
APIError(jsonData['ErrorCode'], jsonData['ErrorEndUserMessage']);
|
|
|
|
|
throw APIException(APIException.BAD_REQUEST, error: apiError);
|
|
|
|
|
}
|
|
|
|
|
// } catch (ex) {
|
|
|
|
@ -103,7 +116,11 @@ class ApiClient {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<Response> postJsonForResponse<T>(String url, T jsonObject,
|
|
|
|
|
{String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0, bool isFormData = false}) async {
|
|
|
|
|
{String? token,
|
|
|
|
|
Map<String, dynamic>? queryParameters,
|
|
|
|
|
Map<String, String>? headers,
|
|
|
|
|
int retryTimes = 0,
|
|
|
|
|
bool isFormData = false}) async {
|
|
|
|
|
String? requestBody;
|
|
|
|
|
late Map<String, String> stringObj;
|
|
|
|
|
if (jsonObject != null) {
|
|
|
|
@ -117,13 +134,22 @@ class ApiClient {
|
|
|
|
|
|
|
|
|
|
if (isFormData) {
|
|
|
|
|
headers = {'Content-Type': 'application/x-www-form-urlencoded'};
|
|
|
|
|
stringObj = ((jsonObject ?? {}) as Map<String, dynamic>).map((key, value) => MapEntry(key, value?.toString() ?? ""));
|
|
|
|
|
stringObj = ((jsonObject ?? {}) as Map<String, dynamic>)
|
|
|
|
|
.map((key, value) => MapEntry(key, value?.toString() ?? ""));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return await _postForResponse(url, isFormData ? stringObj : requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes);
|
|
|
|
|
return await _postForResponse(url, isFormData ? stringObj : requestBody,
|
|
|
|
|
token: token,
|
|
|
|
|
queryParameters: queryParameters,
|
|
|
|
|
headers: headers,
|
|
|
|
|
retryTimes: retryTimes);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<Response> _postForResponse(String url, requestBody, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async {
|
|
|
|
|
Future<Response> _postForResponse(String url, requestBody,
|
|
|
|
|
{String? token,
|
|
|
|
|
Map<String, dynamic>? queryParameters,
|
|
|
|
|
Map<String, String>? headers,
|
|
|
|
|
int retryTimes = 0}) async {
|
|
|
|
|
try {
|
|
|
|
|
var _headers = <String, String>{};
|
|
|
|
|
if (token != null) {
|
|
|
|
@ -138,7 +164,9 @@ class ApiClient {
|
|
|
|
|
var queryString = new Uri(queryParameters: queryParameters).query;
|
|
|
|
|
url = url + '?' + queryString;
|
|
|
|
|
}
|
|
|
|
|
var response = await _post(Uri.parse(url), body: requestBody, headers: _headers).timeout(Duration(seconds: 60));
|
|
|
|
|
var response =
|
|
|
|
|
await _post(Uri.parse(url), body: requestBody, headers: _headers)
|
|
|
|
|
.timeout(Duration(seconds: 120));
|
|
|
|
|
|
|
|
|
|
if (response.statusCode >= 200 && response.statusCode < 300) {
|
|
|
|
|
return response;
|
|
|
|
@ -149,7 +177,11 @@ class ApiClient {
|
|
|
|
|
if (retryTimes > 0) {
|
|
|
|
|
print('will retry after 3 seconds...');
|
|
|
|
|
await Future.delayed(Duration(seconds: 3));
|
|
|
|
|
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
|
|
|
|
|
return await _postForResponse(url, requestBody,
|
|
|
|
|
token: token,
|
|
|
|
|
queryParameters: queryParameters,
|
|
|
|
|
headers: headers,
|
|
|
|
|
retryTimes: retryTimes - 1);
|
|
|
|
|
} else {
|
|
|
|
|
throw APIException(APIException.OTHER, arguments: e);
|
|
|
|
|
}
|
|
|
|
@ -157,7 +189,11 @@ class ApiClient {
|
|
|
|
|
if (retryTimes > 0) {
|
|
|
|
|
print('will retry after 3 seconds...');
|
|
|
|
|
await Future.delayed(Duration(seconds: 3));
|
|
|
|
|
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
|
|
|
|
|
return await _postForResponse(url, requestBody,
|
|
|
|
|
token: token,
|
|
|
|
|
queryParameters: queryParameters,
|
|
|
|
|
headers: headers,
|
|
|
|
|
retryTimes: retryTimes - 1);
|
|
|
|
|
} else {
|
|
|
|
|
throw APIException(APIException.OTHER, arguments: e);
|
|
|
|
|
}
|
|
|
|
@ -167,23 +203,39 @@ class ApiClient {
|
|
|
|
|
if (retryTimes > 0) {
|
|
|
|
|
print('will retry after 3 seconds...');
|
|
|
|
|
await Future.delayed(Duration(seconds: 3));
|
|
|
|
|
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
|
|
|
|
|
return await _postForResponse(url, requestBody,
|
|
|
|
|
token: token,
|
|
|
|
|
queryParameters: queryParameters,
|
|
|
|
|
headers: headers,
|
|
|
|
|
retryTimes: retryTimes - 1);
|
|
|
|
|
} else {
|
|
|
|
|
throw APIException(APIException.OTHER, arguments: e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<Response> getJsonForResponse<T>(String url, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async {
|
|
|
|
|
Future<Response> getJsonForResponse<T>(String url,
|
|
|
|
|
{String? token,
|
|
|
|
|
Map<String, dynamic>? queryParameters,
|
|
|
|
|
Map<String, String>? headers,
|
|
|
|
|
int retryTimes = 0}) async {
|
|
|
|
|
if (headers == null) {
|
|
|
|
|
headers = {'Content-Type': 'application/json'};
|
|
|
|
|
} else {
|
|
|
|
|
headers['Content-Type'] = 'application/json';
|
|
|
|
|
}
|
|
|
|
|
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes);
|
|
|
|
|
return await _getForResponse(url,
|
|
|
|
|
token: token,
|
|
|
|
|
queryParameters: queryParameters,
|
|
|
|
|
headers: headers,
|
|
|
|
|
retryTimes: retryTimes);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<Response> _getForResponse(String url, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0}) async {
|
|
|
|
|
Future<Response> _getForResponse(String url,
|
|
|
|
|
{String? token,
|
|
|
|
|
Map<String, dynamic>? queryParameters,
|
|
|
|
|
Map<String, String>? headers,
|
|
|
|
|
int retryTimes = 0}) async {
|
|
|
|
|
try {
|
|
|
|
|
var _headers = <String, String>{};
|
|
|
|
|
if (token != null) {
|
|
|
|
@ -198,7 +250,8 @@ class ApiClient {
|
|
|
|
|
var queryString = new Uri(queryParameters: queryParameters).query;
|
|
|
|
|
url = url + '?' + queryString;
|
|
|
|
|
}
|
|
|
|
|
var response = await _get(Uri.parse(url), headers: _headers).timeout(Duration(seconds: 60));
|
|
|
|
|
var response = await _get(Uri.parse(url), headers: _headers)
|
|
|
|
|
.timeout(Duration(seconds: 60));
|
|
|
|
|
|
|
|
|
|
if (response.statusCode >= 200 && response.statusCode < 300) {
|
|
|
|
|
return response;
|
|
|
|
@ -209,7 +262,11 @@ class ApiClient {
|
|
|
|
|
if (retryTimes > 0) {
|
|
|
|
|
print('will retry after 3 seconds...');
|
|
|
|
|
await Future.delayed(Duration(seconds: 3));
|
|
|
|
|
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
|
|
|
|
|
return await _getForResponse(url,
|
|
|
|
|
token: token,
|
|
|
|
|
queryParameters: queryParameters,
|
|
|
|
|
headers: headers,
|
|
|
|
|
retryTimes: retryTimes - 1);
|
|
|
|
|
} else {
|
|
|
|
|
throw APIException(APIException.OTHER, arguments: e);
|
|
|
|
|
}
|
|
|
|
@ -217,7 +274,11 @@ class ApiClient {
|
|
|
|
|
if (retryTimes > 0) {
|
|
|
|
|
print('will retry after 3 seconds...');
|
|
|
|
|
await Future.delayed(Duration(seconds: 3));
|
|
|
|
|
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
|
|
|
|
|
return await _getForResponse(url,
|
|
|
|
|
token: token,
|
|
|
|
|
queryParameters: queryParameters,
|
|
|
|
|
headers: headers,
|
|
|
|
|
retryTimes: retryTimes - 1);
|
|
|
|
|
} else {
|
|
|
|
|
throw APIException(APIException.OTHER, arguments: e);
|
|
|
|
|
}
|
|
|
|
@ -227,14 +288,19 @@ class ApiClient {
|
|
|
|
|
if (retryTimes > 0) {
|
|
|
|
|
print('will retry after 3 seconds...');
|
|
|
|
|
await Future.delayed(Duration(seconds: 3));
|
|
|
|
|
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
|
|
|
|
|
return await _getForResponse(url,
|
|
|
|
|
token: token,
|
|
|
|
|
queryParameters: queryParameters,
|
|
|
|
|
headers: headers,
|
|
|
|
|
retryTimes: retryTimes - 1);
|
|
|
|
|
} else {
|
|
|
|
|
throw APIException(APIException.OTHER, arguments: e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<Response> _get(url, {Map<String, String>? headers}) => _withClient((client) => client.get(url, headers: headers));
|
|
|
|
|
Future<Response> _get(url, {Map<String, String>? headers}) =>
|
|
|
|
|
_withClient((client) => client.get(url, headers: headers));
|
|
|
|
|
|
|
|
|
|
bool _certificateCheck(X509Certificate cert, String host, int port) => true;
|
|
|
|
|
|
|
|
|
@ -248,5 +314,8 @@ class ApiClient {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<Response> _post(url, {Map<String, String>? headers, body, Encoding? encoding}) => _withClient((client) => client.post(url, headers: headers, body: body, encoding: encoding));
|
|
|
|
|
Future<Response> _post(url,
|
|
|
|
|
{Map<String, String>? headers, body, Encoding? encoding}) =>
|
|
|
|
|
_withClient((client) =>
|
|
|
|
|
client.post(url, headers: headers, body: body, encoding: encoding));
|
|
|
|
|
}
|
|
|
|
|