Files
flutter_wisetronic/lib/utils/http_util.dart
2022-03-10 00:47:26 -05:00

366 lines
11 KiB
Dart

import 'dart:async';
import 'dart:convert';
import 'package:crypto/crypto.dart';
import 'package:dio/dio.dart';
import '../store/store.dart';
import 'utils.dart';
import 'package:hive/hive.dart';
import 'package:universal_io/io.dart';
import '../constants.dart';
typedef void PostCallback(Response response);
String generateSignature(String string, {String key}) {
if (key == null) {
key = Constants.API_SECRET;
}
Hmac mac = new Hmac(sha256, utf8.encode(key));
Digest digest = mac.convert(utf8.encode(string + key));
String base64Mac = base64.encode(utf8.encode("$digest"));
return base64Mac;
}
class HttpUtil {
static String platformName = Utils.getPlatformName();
static final Map<String, String> headers = {
'Accept': 'application/json',
// 'Content-Type': 'application/json',
'Http-Signature': '',
// 'Http-Group-Id': Constants.GROUP_ID,
'Http-Business-Id': '0',
'Http-App-Key': '',
'Http-Contact-Authorization': '',
'Http-Device-Type': Utils.getOs(checkWeb: true),
'Http-Api-Branch': 'flutter',
'Http-Language-Code': store.state.locale.languageCode,
'Http-Country-Code': store.state.locale.countryCode,
};
static Future<dynamic> httpGet(String url,
{
Map<String, dynamic> queryParameters,
int businessId = 0,
Function(int, int) receiveProgress,
bool returnError = false,
Map<String, String> additionalHeaders,
}) async {
Map<String, dynamic> localHeaders = json.decode(json.encode(headers));
if (additionalHeaders != null) {
localHeaders.addAll(additionalHeaders);
}
if (!url.startsWith('http')) {
localHeaders['Http-Signature'] = generateSignature(url);
}
localHeaders['Http-Business-Id'] = businessId == 0 ? '${Constants.BUSINESS_ID}' : businessId.toString();
Box box = await Utils.getBox();
localHeaders['Http-Contact-Authorization'] = box.get(Constants.KEY_ACCESS_TOKEN, defaultValue: '');
localHeaders['Http-App-Key'] = platformName;
localHeaders['Http-Device-Type'] = platformName;
String requestUrl = Constants.BASE_API_URL + url;
if (url.startsWith('http')) {
requestUrl = url;
}
Utils.jsonPrettyPrint(queryParameters);
Dio dio = Dio();
try {
Response response = await dio.get(requestUrl,
queryParameters: queryParameters,
options: Options(
headers: localHeaders
),
onReceiveProgress: receiveProgress,
).timeout(const Duration(seconds: 30));
// print('response data: ${response.data}');
// Utils.jsonPrettyPrint(response.data);
int statusCode = response.statusCode;
return response.data;
} on DioError catch(e) {
print('HttpGet failed, request: $requestUrl, headers: $localHeaders, error ${e.response}');
if (returnError) {
return e;
}
throw e;
}
}
static Future<dynamic> httpPost(String url, PostCallback callback,
{
Map<String, dynamic> queryParameters,
int businessId = 0,
bool isFormData = false,
Map<String, String> additionalHeaders,
Map<String, dynamic> body,
FormData formData,
Function(int, int) sendProgress,
Function(int, int) receiveProgress,
bool returnError = false,
}) async {
Map<String, dynamic> localHeaders = json.decode(json.encode(headers));
if (additionalHeaders != null) {
localHeaders.addAll(additionalHeaders);
}
if (!url.startsWith('http')) {
localHeaders['Http-Signature'] = generateSignature(url);
}
localHeaders['Http-Business-Id'] = businessId == 0 ? '${Constants.BUSINESS_ID}' : businessId.toString();
Box box = await Utils.getBox();
localHeaders['Http-Contact-Authorization'] = box.get(Constants.KEY_ACCESS_TOKEN, defaultValue: '');
localHeaders['Http-App-Key'] = platformName;
localHeaders['Http-Device-Type'] = platformName;
// Add the line below will not work.
//localHeaders['Content-Type'] = isFormData ? Headers.formUrlEncodedContentType : Headers.jsonContentType;
String requestUrl = Constants.BASE_API_URL + url;
if (url.startsWith('http')) {
requestUrl = url;
}
// Don't print body will cause upload Multipart file failed
//Utils.jsonPrettyPrint(body);
Dio dio = Dio();
dio.interceptors.add(LogInterceptor());
try {
Response response = await dio.post(
requestUrl,
queryParameters: queryParameters == null ? {} : queryParameters,
data: isFormData ? ((formData != null)?formData:FormData.fromMap(body)) : json.encode(body),
options: Options(
headers: localHeaders,
contentType: isFormData ? Headers.formUrlEncodedContentType : Headers.jsonContentType,
),
onSendProgress: sendProgress,
onReceiveProgress: receiveProgress,
).timeout(Duration(seconds: 30));
// Utils.jsonPrettyPrint(response.data);
int statusCode = response.statusCode;
if (callback != null) {
callback(response);
}
return response.data;
} on DioError catch(e, stacktrace) {
if (e.response != null) {
try {
Utils.jsonPrettyPrint(e.response.data);
} catch (err) {
print(e.response.data);
}
}
if (returnError) {
return e;
}
throw e;
}
}
static Future<dynamic> httpPut(String url, PostCallback callback,
{
Map<String, dynamic> queryParameters,
int businessId = 0,
Map<String, String> additionalHeaders,
Map<String, dynamic> body,
Function(int, int) sendProgress,
Function(int, int) receiveProgress,
bool returnError = false,
}) async {
Map<String, dynamic> localHeaders = json.decode(json.encode(headers));
if (additionalHeaders != null) {
localHeaders.addAll(additionalHeaders);
}
if (!url.startsWith('http')) {
localHeaders['Http-Signature'] = generateSignature(url);
}
localHeaders['Http-Business-Id'] = businessId == 0 ? '${Constants.BUSINESS_ID}' : businessId.toString();
Box box = await Utils.getBox();
localHeaders['Http-Contact-Authorization'] = box.get(Constants.KEY_ACCESS_TOKEN, defaultValue: '');
localHeaders['Http-App-Key'] = platformName;
localHeaders['Http-Device-Type'] = platformName;
localHeaders['Content-Type'] = Headers.jsonContentType;
String requestUrl = Constants.BASE_API_URL + url;
if (url.startsWith('http')) {
requestUrl = url;
}
Dio dio = Dio();
try {
Response response = await dio.put(
requestUrl,
queryParameters: queryParameters == null ? {} : queryParameters,
data: json.encode(body),
options: Options(
headers: localHeaders,
),
onSendProgress: sendProgress,
onReceiveProgress: receiveProgress,
).timeout(Duration(seconds: 30));
// Utils.jsonPrettyPrint(response.data);
int statusCode = response.statusCode;
if (callback != null) {
callback(response);
}
return response.data;
} on DioError catch(e) {
if (e.response != null) {
Utils.jsonPrettyPrint(e.response.data);
}
if (returnError) {
return e;
}
throw e;
}
}
static Future<dynamic> httpPatch(String url, PostCallback callback,
{
Map<String, dynamic> queryParameters,
int businessId = 0,
Map<String, String> additionalHeaders,
Map<String, dynamic> body,
Function(int, int) sendProgress,
Function(int, int) receiveProgress,
bool returnError = false,
}) async {
Map<String, dynamic> localHeaders = json.decode(json.encode(headers));
if (additionalHeaders != null) {
localHeaders.addAll(additionalHeaders);
}
if (!url.startsWith('http')) {
localHeaders['Http-Signature'] = generateSignature(url);
}
localHeaders['Http-Business-Id'] = businessId == 0 ? '${Constants.BUSINESS_ID}' : businessId.toString();
Box box = await Utils.getBox();
localHeaders['Http-Contact-Authorization'] = box.get(Constants.KEY_ACCESS_TOKEN, defaultValue: '');
localHeaders['Http-App-Key'] = platformName;
localHeaders['Http-Device-Type'] = platformName;
localHeaders['Content-Type'] = Headers.jsonContentType;
String requestUrl = Constants.BASE_API_URL + url;
if (url.startsWith('http')) {
requestUrl = url;
}
Utils.jsonPrettyPrint(body);
Dio dio = Dio();
try {
Response response = await dio.patch(
requestUrl,
queryParameters: queryParameters == null ? {} : queryParameters,
data: json.encode(body),
options: Options(
headers: localHeaders,
),
onSendProgress: sendProgress,
onReceiveProgress: receiveProgress,
).timeout(Duration(seconds: 30));
// Utils.jsonPrettyPrint(response.data);
int statusCode = response.statusCode;
if (callback != null) {
callback(response);
}
return response.data;
} on DioError catch(e) {
if (e.response != null) {
Utils.jsonPrettyPrint(e.response.data);
}
if (returnError) {
return e;
}
throw e;
}
}
static Future<dynamic> httpDelete(String url, PostCallback callback,
{
Map<String, dynamic> queryParameters,
int businessId = 0,
Map<String, String> additionalHeaders,
Map<String, dynamic> body,
bool returnError = false,
}) async {
Map<String, dynamic> localHeaders = json.decode(json.encode(headers));
if (additionalHeaders != null) {
localHeaders.addAll(additionalHeaders);
}
if (!url.startsWith('http')) {
localHeaders['Http-Signature'] = generateSignature(url);
}
localHeaders['Http-Business-Id'] = businessId == 0 ? '${Constants.BUSINESS_ID}' : businessId.toString();
Box box = await Utils.getBox();
localHeaders['Http-Contact-Authorization'] = box.get(Constants.KEY_ACCESS_TOKEN, defaultValue: '');
localHeaders['Http-App-Key'] = platformName;
localHeaders['Http-Device-Type'] = platformName;
localHeaders['Content-Type'] = Headers.jsonContentType;
String requestUrl = Constants.BASE_API_URL + url;
if (url.startsWith('http')) {
requestUrl = url;
}
Utils.jsonPrettyPrint(body);
Dio dio = Dio();
try {
Response response = await dio.delete(
requestUrl,
queryParameters: queryParameters == null ? {} : queryParameters,
data: json.encode(body),
options: Options(
headers: localHeaders,
),
).timeout(Duration(seconds: 30));
// Utils.jsonPrettyPrint(response.data);
int statusCode = response.statusCode;
if (callback != null) {
callback(response);
}
return response.data;
} on DioError catch(e) {
if (e.response != null) {
Utils.jsonPrettyPrint(e.response.data);
}
if(returnError) {
return e;
}
throw e;
}
}
}