http_wrap 1.1.4
http_wrap: ^1.1.4 copied to clipboard
A lightweight Dart and Flutter HTTP wrapper with shared configuration, multipart uploads, and unified responses.
http_wrap #
A lightweight Dart/Flutter wrapper around the http package to make API calls
simpler.
Set your request values (fields, headers, queryParams, requestFiles, etc.) and
call one method.
Features #
- Simple, single entry-point request API
- Base URL and default header configuration
- Query params support
- JSON request body support
- Multipart/form-data support for file uploads
- Unified response object (
HttpResponse) - Structured error metadata (
errorCode,errorData) for failed requests - Basic timeout and network error handling
Installation #
Add to your pubspec.yaml:
dependencies:
http_wrap: ^1.1.4
Then run:
flutter pub get
Quick Start #
import 'package:http_wrap/http_wrap.dart';
final api = HttpWrap()
..config(
baseUrl: 'https://fakerapi.it',
defaultHeaders: {
'Content-Type': 'application/json',
'Accept': 'application/json',
},
timeout: 30,
);
GET Request With Query Params #
final res = await api.request(
method: .get,
endpoint: '/api/v2/books',
queryParams: {
'_quantity': '5',
'_locale': 'en_US',
},
);
if (res.success) {
print(res.data);
} else {
print(res.message);
}
POST Request With JSON Body #
final res = await api.request(
method: .post,
endpoint: '/api/v1/users',
fields: {
'name': 'John Doe',
'email': 'john@acme.com',
},
headers: {
'Authorization': 'Bearer your_token_here',
},
);
Multipart/Form-Data Request (File Upload) #
import 'package:http_wrap/request_file_type/request_file_from_path.dart';
final res = await api.request(
method: .post,
endpoint: '/api/v1/upload',
useFormData: true,
fields: {
'title': 'Profile photo',
},
requestFiles: [
RequestFileFromPath(itemKey: 'file', path: '/absolute/path/to/image.jpg'),
],
);
API Reference #
config #
void config({
String? baseUrl,
Map<String, String>? defaultHeaders,
int? timeout,
})
baseUrl: Default host/base URL used when callingrequestdefaultHeaders: Headers automatically added to every requesttimeout: Timeout in seconds (default:100)
request #
Future<HttpResponse> request({
required HttpMethod method,
required String endpoint,
String? baseUrl,
Map<String, dynamic>? fields,
Map<String, dynamic>? queryParams,
Map<String, String>? headers,
@Deprecated('Use requestFiles instead.')
List<({String key, String? path})> files = const [],
List<RequestFile> requestFiles = const [],
bool useFormData = false,
})
method: HTTP method (.get,.post,.put,.patch,.delete)endpoint: API route, example:/api/v2/booksbaseUrl: Per-request base URL overridefields: JSON body fields (or multipart form fields)queryParams: URL query parametersheaders: Per-request headersrequestFiles: Files for multipart requests (RequestFileFromPath,RequestFileFromBytes,RequestFileFromString)files: Deprecated. Backward-compatible multipart files using(key, path)useFormData: Force multipart/form-data
Response Shape #
Every request returns HttpResponse:
class HttpResponse {
final String? message;
final dynamic data;
final bool success;
final ({int? errorCode, dynamic errorData})? errorData;
}
Typical checks:
if (response.success) {
// handle response.data
} else {
// handle response.message
print(response.errorData?.errorCode);
print(response.errorData?.errorData);
}
Notes #
nullvalues infieldsare automatically removed before sending.- In multipart requests, non-scalar field values (like
ListandMap) are JSON-encoded before sending. - For multipart requests, avoid manually setting
content-type; it is handled internally. - Network and timeout errors are converted to readable
messagevalues. - For non-2xx responses,
successisfalseanderrorDatacontains server error details.
License #
This project is licensed under the MIT License. See LICENSE for details.