Api client
Fri Jan 12 2024 09:29:57 GMT+0000 (Coordinated Universal Time)
Saved by @Samuel1347 #flutter #dart
import 'dart:convert'; import 'dart:developer'; import 'package:flutter/foundation.dart'; import 'package:http/http.dart'; import 'package:http/http.dart' as http; import '../../features/auth/data/datasources/authentication_local_data_source.dart'; import 'api_constants.dart'; import 'api_exceptions.dart'; class ApiClient { final AuthenticationLocalDataSource _authenticationLocalDataSource; final Client _client; ApiClient(this._client, this._authenticationLocalDataSource); dynamic get(String path, {Map<dynamic, dynamic>? filter, bool parse = true, Map<String, dynamic>? params}) async { String sessionId = await _authenticationLocalDataSource.getSessionId() ?? ""; var paramsString = ''; if (filter?.isNotEmpty ?? false) { filter?.forEach((key, value) { paramsString += '&$key=$value'; }); } final pth = Uri.parse('${ApiConstants.baseApiUrl}$path$paramsString').replace( queryParameters: params, ); debugPrint("Pth $pth"); final header = { 'Authorization': sessionId, 'Content-Type': 'application/json', }; final response = await _client.get( pth, //?format=json headers: header, ); // log("Token $sessionId path: ${pth} header $header Status code: ${response.statusCode}"); // debugPrint("Get balance $pth status code ${response.statusCode} body ${response.body}"); if (response.statusCode == 200) { if (parse) { return json.decode(utf8.decode(response.bodyBytes)); } return response.body; } else if (response.statusCode == 400 || response.statusCode == 404) { String msg = "unknown_error"; var resp = jsonDecode(utf8.decode(response.bodyBytes)); if (resp.containsKey("error")) { msg = resp["error"]; } else if (resp.containsKey("message")) { var rsp = resp["message"]; if (rsp.runtimeType == String) msg = resp["message"]; if (rsp.runtimeType == List) msg = rsp[0]; } else { msg = utf8 .decode(response.bodyBytes) .replaceAll("[", '') .replaceAll("]", '') .replaceAll("}", '') .replaceAll("{", '') .replaceAll("\\", ''); } throw ExceptionWithMessage(msg); } else if (response.statusCode == 401) { throw UnauthorisedException(); } else { throw Exception(response.reasonPhrase); } } dynamic postPhoto({ required List<int> fileBytes, required String userId, required String role, }) async { String? sessionId = await _authenticationLocalDataSource.getSessionId(); var headers = { 'Content-Type': 'multipart/form-data', }; if (sessionId != '') { headers.addAll({'Authorization': '$sessionId'}); } var request = http.MultipartRequest( 'POST', Uri.parse( "${ApiConstants.baseApiUrl}${ApiConstants.uploads}", ), ); final avatar = http.MultipartFile.fromBytes( 'avatar', fileBytes, filename: 'avatar.png', ); // Добавляем файл в запрос request.files.add( avatar, ); // Добавляем параметры в тело запроса // request.fields['avatar'] = avatar; request.fields['userId'] = userId; request.fields['path'] = role; request.headers.addAll(headers); try { final response = await request.send(); debugPrint("message ${response.request}"); debugPrint("Status ${response.statusCode}"); if (response.statusCode == 200) { debugPrint(await response.stream.bytesToString()); return true; } else { debugPrint(response.reasonPhrase); return false; } } catch (error) { debugPrint("Error: $error"); return false; } } dynamic post( String path, { Map<dynamic, dynamic>? params, bool withToken = true, }) async { String sessionId = await _authenticationLocalDataSource.getSessionId() ?? ""; Map<String, String> userHeader = { "Content-type": "application/json", "Accept": "*/*" }; if (kDebugMode) { debugPrintThrottled("Request params: $params "); } if (sessionId != '' && withToken) { log("Session != null $sessionId"); userHeader.addAll({ 'Authorization': ' $sessionId', }); } final uri = Uri.parse(ApiConstants.baseApiUrl + path); log("Post uri = $uri"); log("Post header = $userHeader"); debugPrint("Post body = ${jsonEncode(params)}"); final response = await _client.post( uri, body: jsonEncode(params), headers: userHeader, ); if (kDebugMode) { debugPrint("API post response: ${response.statusCode} "); debugPrint(utf8.decode(response.bodyBytes)); } debugPrint("Response status ${response.statusCode}"); if (response.statusCode == 200 || response.statusCode == 201) { // debugPrint("Everyt thing ok"); return json.decode(utf8.decode(response.bodyBytes)); } if (response.statusCode == 400 || response.statusCode == 403 || response.statusCode == 405 || response.statusCode == 500 || response.statusCode == 409) { String msg = "unknown_error"; var resp = jsonDecode(utf8.decode(response.bodyBytes)); if (resp.containsKey("error")) { msg = resp["error"]; } else if (resp.containsKey("message")) { var rsp = resp["message"]; if (rsp.runtimeType == String) msg = resp["message"]; if (rsp.runtimeType == List) msg = rsp[0]; } else { msg = utf8 .decode(response.bodyBytes) .replaceAll("[", '') .replaceAll("]", '') .replaceAll("}", '') .replaceAll("{", '') .replaceAll("\\", ''); } throw ExceptionWithMessage(msg); } else if (response.statusCode == 401) { throw UnauthorisedException(); } else if (response.statusCode == 404) { throw const ExceptionWithMessage("Not found"); } else { debugPrint("Exception ${response.reasonPhrase}"); throw Exception(response.reasonPhrase); } } dynamic patch(String path, {Map<dynamic, dynamic>? params}) async { String sessionId = await _authenticationLocalDataSource.getSessionId() ?? ""; Map<String, String> userHeader = { 'Content-Type': 'application/json', 'Accept': 'application/json', }; if (sessionId != '') { userHeader.addAll({'Authorization': sessionId}); } final pth = getPath(path, null); debugPrint("Path $pth"); final response = await _client.patch( pth, body: jsonEncode(params), headers: userHeader, ); if (kDebugMode) { debugPrint(utf8.decode(response.bodyBytes)); } debugPrint("Response $path ${response.statusCode}"); if (response.statusCode == 200 || response.statusCode == 201) { // debugPrint("Everyt thing ok"); return json.decode(utf8.decode(response.bodyBytes)); } if (response.statusCode == 400 || response.statusCode == 403 || response.statusCode == 405) { String msg = "unknown_error"; var resp = jsonDecode(utf8.decode(response.bodyBytes)); if (resp.containsKey("error")) { msg = resp["error"]; } else if (resp.containsKey("message")) { var rsp = resp["message"]; if (rsp.runtimeType == String) msg = resp["message"]; if (rsp.runtimeType == List) msg = rsp[0]; } else { msg = utf8 .decode(response.bodyBytes) .replaceAll("[", '') .replaceAll("]", '') .replaceAll("}", '') .replaceAll("{", '') .replaceAll("\\", ''); } throw ExceptionWithMessage(msg); } else if (response.statusCode == 401) { throw UnauthorisedException(); } else if (response.statusCode == 404) { throw const ExceptionWithMessage("Not found"); } else { debugPrint("Exception ${response.reasonPhrase}"); throw Exception(response.reasonPhrase); } } dynamic deleteWithBody(String path, {Map<dynamic, dynamic>? params}) async { String sessionId = (await _authenticationLocalDataSource.getSessionId()) ?? ""; final response = await _client.delete( //getPath(path, null), Uri.parse('${ApiConstants.baseApiUrl}$path'), headers: { 'Authorization': ' $sessionId', // 'Content-Type': 'application/json', }, ); debugPrint("API delete response code: ${response.statusCode} "); debugPrint(utf8.decode(response.bodyBytes)); if (response.statusCode == 204) { return {'success': true}; } else if (response.statusCode == 200) { return {'success': true}; } else if (response.statusCode == 400 || response.statusCode == 403 || response.statusCode == 402 || response.statusCode == 405) { String msg = "unknown_error"; var resp = jsonDecode(utf8.decode(response.bodyBytes)); if (resp.containsKey("error")) { msg = resp["error"]; } else if (resp.containsKey("message")) { var rsp = resp["message"]; if (rsp.runtimeType == String) msg = resp["message"]; if (rsp.runtimeType == List) msg = rsp[0]; } else { msg = utf8 .decode(response.bodyBytes) .replaceAll("[", '') .replaceAll("]", '') .replaceAll("}", '') .replaceAll("{", '') .replaceAll("\\", ''); } throw ExceptionWithMessage(msg); } else if (response.statusCode == 401) { throw UnauthorisedException(); } else { throw Exception(response.reasonPhrase); } } Uri getPath(String path, Map<dynamic, dynamic>? params) { var paramsString = ''; if (params?.isNotEmpty ?? false) { params?.forEach((key, value) { paramsString += '&$key=$value'; }); } return Uri.parse('${ApiConstants.baseApiUrl}$path$paramsString'); // '${ApiConstants.BASE_URL}$path?api_key=${ApiConstants.API_KEY}$paramsString'); } } // ================ DIO ================ // // // import 'dart:convert'; // import 'dart:developer'; // // import 'package:dio/dio.dart'; // import 'package:dio_http_cache/dio_http_cache.dart'; // import 'package:flutter/foundation.dart'; // // import '../../features/auth/data/datasources/authentication_local_data_source.dart'; // import 'api_constants.dart'; // import 'api_exceptions.dart'; // // class ApiClient { // final AuthenticationLocalDataSource _authenticationLocalDataSource; // final Dio _dio; // // ApiClient(this._dio, this._authenticationLocalDataSource) { // _dio.interceptors.add( // InterceptorsWrapper( // onRequest: (options, handler) async { // // options.headers.addAll({ // // 'Content-Type': 'application/json', // // }); // return handler.next(options); // }, // ), // ); // // _dio.interceptors.add( // DioCacheManager(CacheConfig( // baseUrl: ApiConstants.baseApiUrl, // defaultMaxAge: const Duration(days: 3), // defaultMaxStale: const Duration(days: 5))) // .interceptor, // ); // } // // Future<dynamic> get(String path, // {Map<dynamic, dynamic>? filter, // bool parse = true, // Map<String, dynamic>? params}) async { // try { // final sessionToken = await _authenticationLocalDataSource.getSessionId(); // final header = { // 'Authorization': sessionToken, // 'Content-Type': 'application/json', // }; // final response = await _dio.get(path, // // queryParameters: params, // options: Options( // headers: header, // )); // // if (response.statusCode == 200) { // if (parse) { // return json.decode(response.data); // } // return response.data; // } else if (response.statusCode == 400 || response.statusCode == 404) { // throw const ExceptionWithMessage("Unknown error"); // } else if (response.statusCode == 401) { // throw UnauthorisedException(); // } else { // throw Exception(response.statusMessage); // } // } catch (error) { // throw Exception("Error: $error"); // } // } // // Future<dynamic> post(String path, // {Map<dynamic, dynamic>? params, bool withToken = true}) async { // try { // String sessionId = // await _authenticationLocalDataSource.getSessionId() ?? ""; // Map<String, String> userHeader = { // "Content-type": "application/json", // "Accept": "*/*" // }; // // final uri = ApiConstants.baseApiUrl + path; // // final response = await _dio.post( // uri, // options: Options(headers: userHeader), // data: jsonEncode(params), // ); // // if (sessionId != '' && withToken) { // log("Session != null $sessionId"); // userHeader.addAll({ // 'Authorization': ' $sessionId', // }); // } // // debugPrint("API post response: ${response.statusCode} "); // debugPrint(utf8.decode(response.data)); // if (response.statusCode == 200 || response.statusCode == 201) { // return json.decode(response.data.toString()); // } else if (response.statusCode == 400 || // response.statusCode == 403 || // response.statusCode == 405 || // response.statusCode == 500 || // response.statusCode == 409) { // throw const ExceptionWithMessage("Unknown error"); // } else if (response.statusCode == 401) { // throw UnauthorisedException(); // } else if (response.statusCode == 404) { // throw const ExceptionWithMessage("Not found"); // } else { // throw Exception(response.statusMessage); // } // } catch (error) { // throw Exception("Error: $error"); // } // } // // Future<dynamic> postPhoto({ // required List<int> fileBytes, // required String userId, // required String role, // }) async { // try { // final sessionId = await _authenticationLocalDataSource.getSessionId(); // // var headers = { // 'Content-Type': 'multipart/form-data', // }; // // if (sessionId != '') { // headers.addAll({'Authorization': '$sessionId'}); // } // // var request = FormData.fromMap({ // 'avatar': MultipartFile.fromBytes( // fileBytes, // filename: 'avatar.png', // ), // 'userId': userId, // 'path': role, // }); // // final response = await _dio.post( // "${ApiConstants.baseApiUrl}${ApiConstants.uploads}", // data: request, // options: Options(headers: headers), // ); // // if (response.statusCode == 200) { // return true; // } else { // return false; // } // } catch (error) { // throw Exception("Error: $error"); // } // } // // // Добавьте другие методы, такие как patch, deleteWithBody, если они используются в вашем коде. // // // ... // // Future<dynamic> patch(String path, {Map<dynamic, dynamic>? params}) async { // try { // final sessionId = await _authenticationLocalDataSource.getSessionId(); // // var userHeader = { // 'Content-Type': 'application/json', // 'Accept': '*/*', // }; // // if (kDebugMode) { // debugPrintThrottled("Request params: $params "); // } // // if (sessionId != '') { // userHeader.addAll({ // 'Authorization': ' $sessionId', // }); // } // // final response = await _dio.patch( // ApiConstants.baseApiUrl + path, // data: params, // options: Options(headers: userHeader), // ); // // if (response.statusCode == 200 || response.statusCode == 201) { // return json.decode(response.toString()); // } else if (response.statusCode == 400 || // response.statusCode == 403 || // response.statusCode == 405) { // throw const ExceptionWithMessage("Unknown error"); // } else if (response.statusCode == 401) { // throw UnauthorisedException(); // } else if (response.statusCode == 404) { // throw const ExceptionWithMessage("Not found"); // } else { // throw Exception(response.statusMessage); // } // } catch (error) { // throw Exception("Error: $error"); // } // } // // Future<dynamic> deleteWithBody(String path, // {Map<dynamic, dynamic>? params}) async { // try { // final sessionId = await _authenticationLocalDataSource.getSessionId(); // // final response = await _dio.delete( // '${ApiConstants.baseApiUrl}$path', // data: params, // options: Options( // headers: { // 'Authorization': ' $sessionId', // }, // ), // ); // // if (response.statusCode == 204 || response.statusCode == 200) { // return {'success': true}; // } else if (response.statusCode == 400 || // response.statusCode == 403 || // response.statusCode == 402 || // response.statusCode == 405) { // throw const ExceptionWithMessage("Unknown error"); // } else if (response.statusCode == 401) { // throw UnauthorisedException(); // } else { // throw Exception(response.statusMessage); // } // } catch (error) { // throw Exception("Error: $error"); // } // } // // Uri getPath(String path, Map<dynamic, dynamic>? params) { // var paramsString = ''; // if (params?.isNotEmpty ?? false) { // params?.forEach((key, value) { // paramsString += '&$key=$value'; // }); // } // // return Uri.parse('${ApiConstants.baseApiUrl}$path$paramsString'); // } // }
Comments