flex_http 0.1.1
flex_http: ^0.1.1 copied to clipboard
A lightweight, flexible, and user-friendly HTTP client for Dart and Flutter.
FlexHttp #
A lightweight, flexible, and user-friendly HTTP client for Dart and Flutter, developed by Rudradeep. Built with simplicity and extensibility in mind, the flex_http package supports all major platforms (including Web and WASM) and offers powerful features like retries, caching, streaming, file uploads, and custom interceptors.
Features #
- Cross-Platform: Works on iOS, Android, Windows, macOS, Linux.
- HTTP Methods: Supports GET, POST, PUT, DELETE, PATCH, and file uploads.
- Automatic Retries: Configurable retry logic for handling network failures.
- In-Memory Caching: Cache GET responses to reduce redundant requests.
- Streaming: Efficiently handle large responses with streamed data.
- Interceptors: Customize request and response handling with flexible interceptors.
- Timeouts: Set per-request timeouts for reliable network operations.
- Logging: Optional built-in logging for debugging.
Installation #
Add the flex_http package to your project by including it in your pubspec.yaml:
dependencies:
flex_http: ^0.1.1
Then, run:
dart pub get
Or, if you're using Flutter:
flutter pub get
Usage #
Basic Request #
Make a simple GET request with flex_http:
import 'package:flex_http/flex_http.dart';
void main() async {
final client = FlexHttpBuilder(baseUrl: 'https://jsonplaceholder.typicode.com').build();
final response = await client.get<Map<String, dynamic>>('/posts/1');
print('Post Title: ${response.decodedBody()['title']}');
client.close();
}
POST with Body #
Send a POST request with a JSON body:
import 'dart:convert';
import 'package:flex_http/flex_http.dart';
void main() async {
final client = FlexHttpBuilder(baseUrl: 'https://jsonplaceholder.typicode.com').build();
final response = await client.post<Map<String, dynamic>>(
'/posts',
body: {'title': 'New Post', 'body': 'Hello World', 'userId': 1},
);
print('Created Post ID: ${response.decodedBody()['id']}');
client.close();
}
File Upload #
Upload a file (as bytes):
import 'dart:convert';
import 'package:flex_http/flex_http.dart';
void main() async {
final client = FlexHttpBuilder(baseUrl: 'https://jsonplaceholder.typicode.com').build();
final fileBytes = utf8.encode('Test content'); // Simulate file content
final response = await client.upload<String>(
'/posts',
fileBytes: fileBytes,
fileName: 'test.txt',
decoder: (body) => body.toString(),
);
print('Upload Response: ${response.body}');
client.close();
}
Streaming Response #
Stream a response for large data:
import 'dart:convert';
import 'package:flex_http/flex_http.dart';
void main() async {
final client = FlexHttpBuilder(baseUrl: 'https://jsonplaceholder.typicode.com').build();
final stream = client.stream<String>('/posts/1');
await for (final chunk in stream) {
print('Chunk: ${chunk.data}');
break; // Stop after first chunk for this example
}
client.close();
}
Custom Configuration #
Use FlexHttpBuilder to configure flex_http with retries, logging, and interceptors:
import 'dart:convert';
import 'package:flex_http/flex_http.dart';
void main() async {
final client = FlexHttpBuilder(baseUrl: 'https://jsonplaceholder.typicode.com')
.withMaxRetries(3) // Retry failed requests up to 3 times
.withTimeout(Duration(seconds: 5)) // 5-second timeout
.withLogging(true) // Enable request/response logging
.withInterceptor(LoggingInterceptor()) // Add custom interceptor
.build();
final response = await client.get<Map<String, dynamic>>('/posts/1');
print(response.decodedBody()['title']);
client.close();
}
Caching #
Enable caching for GET requests:
import 'dart:convert';
import 'package:flex_http/flex_http.dart';
void main() async {
final client = FlexHttpBuilder(baseUrl: 'https://jsonplaceholder.typicode.com').build();
final response1 = await client.get<Map<String, dynamic>>('/posts/1', useCache: true);
print('First call: ${response1.decodedBody()['title']}');
final response2 = await client.get<Map<String, dynamic>>('/posts/1', useCache: true);
print('Cached call: ${response2.decodedBody()['title']}');
client.close();
}
Configuration Options #
FlexHttpBuilder provides a fluent API to customize your flex_http client:
withBaseUrl(String url): Sets the base URL for all requests.withHeader(String key, String value): Adds a default header.withTimeout(Duration duration): Sets a timeout for requests.withMaxRetries(int retries): Configures the number of retry attempts.withLogging(bool enable): Enables/disables logging.withInterceptor(FlexInterceptor interceptor): Adds a custom interceptor.
Custom Interceptors #
Create custom interceptors by extending FlexInterceptor:
class AuthInterceptor extends FlexInterceptor {
@override
Future<void> onRequest(FlexHttpRequest request) async {
request.request.headers['Authorization'] = 'Bearer your-token';
}
@override
Future<void> onResponse(FlexResponse response) async {
if (response.statusCode == 401) {
print('Unauthorized - refreshing token...');
}
}
}
final client = FlexHttpBuilder(baseUrl: 'https://api.example.com')
.withInterceptor(AuthInterceptor())
.build();
Platform Support #
The flex_http package is fully compatible with:
- iOS
- Android
- Web
- Windows
- macOS
- Linux
- WASM (WebAssembly)
Thanks to the http package dependency, flex_http works seamlessly across all Dart platforms.
Contributing #
Contributions to flex_http are welcome! To get started:
-
Fork the repository: https://github.com/Deep3way/Flex_http
-
Clone your fork:
git clone https://github.com/<your-username>/Flex_http.git -
Create a branch:
git checkout -b feature/your-feature-name -
Make your changes and commit:
git commit -m "Add your feature" -
Push to your fork:
git push origin feature/your-feature-name -
Open a pull request on the main repository.
Please ensure your code is formatted with dart format and includes tests where applicable.
License #
flex_http is released under the BSD 3-Clause License by Rudradeep. See the LICENSE file for details.
Contact #
For questions, suggestions, or support, feel free to reach out to Rudradeep via the issue tracker on GitHub.
Happy coding with flex_http! 🚀
Made With ❤️ By Rudradeep!