import 'dart:convert'; import 'dart:developer'; import 'dart:io'; import 'package:http/http.dart' as http; class RequestService { static late String _token; static set token(value) => _token = value; Map get result => _body['result'] ?? const {}; Map get errors => _body['errors'] ?? const {}; String? errorMessage; dynamic _body; final Map _headers = { "accept": "*/*", "Content-Type": "application/json; charset=UTF-8", }; final String url; dynamic _requestBody; bool isSuccess = false; RequestService( this.url, { Map? requestHeaders, body, bool useAutherization = true, }) { if (body != null) _requestBody = body; if (requestHeaders != null) _headers.addAll(requestHeaders); if (useAutherization) _headers.addAll({'Authorization': 'Bearer $_token'}); if (body != null) _requestBody = body; } Future httpGet() async { try { final response = await http .get( Uri.parse(url), headers: _headers, ) .timeout( const Duration(seconds: 10), ) .catchError( (e) => throw e, ); _handleResponse(response); } catch (e) { _handleError(null); } } Future post() async { try { final response = await http .post( Uri.parse(url), body: json.encode(_requestBody), headers: _headers, ) .timeout( const Duration(seconds: 10), ) .catchError( (e) { throw e; }, ); _handleResponse(response); } catch (e) { _handleError(null); } } Future delete() async { try { final response = await http .delete( Uri.parse(url), body: json.encode(_requestBody), headers: _headers, ) .timeout( const Duration(seconds: 10), ) .catchError( (e) => throw e, ); _handleResponse(response); } catch (e) { _handleError(null); } } Future multipart(File file) async { try { final request = http.MultipartRequest('POST', Uri.parse(url)); _headers.update('Content-Type', (_) => 'multipart/form-data'); request.headers.addAll(_headers); request.files.add( http.MultipartFile( 'file', file.readAsBytes().asStream(), file.lengthSync(), filename: 'desc', ), ); final streamedResponse = await request .send() .timeout( const Duration(seconds: 10), ) .catchError( (e) => throw e, ); final response = await http.Response.fromStream(streamedResponse); _handleResponse(response); } catch (e) { _handleError(null); } } Future put() async { try { final response = await http .put( Uri.parse(url), body: json.encode(_requestBody), headers: _headers, ) .timeout( const Duration(seconds: 10), ) .catchError( (e) => throw e, ); _handleResponse(response); } catch (e) { _handleError(null); } } void _handleResponse(http.Response? response) { if (_handleError(response)) { if (response!.body.isNotEmpty) { _body = json.decode(response.body); } } errorMessage = _errorMessageGenerator(); } bool _handleError(http.Response? response) { if (response == null) { log( 'Connecion failed or request timedout! ("$url")', name: 'Request fail error', ); isSuccess = false; return false; } if (response.statusCode != 200 && response.statusCode != 204) { String data; if (response.body.isEmpty) { data = 'No results!'; } else if (response.body.contains('')) { data = response.body; } else { data = jsonDecode(response.body); } log( 'Request to [$url] failed with status code ${response.statusCode} & result : \n $data', name: 'Request fail error', ); isSuccess = false; return false; } isSuccess = true; return true; } String _errorMessageGenerator() { return isSuccess ? result['msg'] : 'خطا! لطفا اتصال اینترنت خود را بررسی و مجددا تلاش نمایید.'; } }