From reactree-flutter-dev
HTTP client configuration, API providers, error handling, and request/response patterns
How this skill is triggered — by the user, by Claude, or both
Slash command
/reactree-flutter-dev:skills/http-integrationThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
```dart
import 'dart:convert';
import 'package:http/http.dart' as http;
class UserProvider {
final http.Client _client;
final String _baseUrl;
UserProvider(this._client, {String? baseUrl})
: _baseUrl = baseUrl ?? 'https://api.example.com';
Map<String, String> get _headers => {
'Content-Type': 'application/json',
'Accept': 'application/json',
};
Future<UserModel> fetchUser(String id) async {
final response = await _client.get(
Uri.parse('$_baseUrl/users/$id'),
headers: _headers,
).timeout(Duration(seconds: 10));
if (response.statusCode == 200) {
return UserModel.fromJson(json.decode(response.body));
} else if (response.statusCode == 404) {
throw ServerException(message: 'User not found');
} else {
throw ServerException(
message: 'Failed to fetch user',
statusCode: response.statusCode,
);
}
}
Future<List<UserModel>> fetchAllUsers() async {
final response = await _client.get(
Uri.parse('$_baseUrl/users'),
headers: _headers,
).timeout(Duration(seconds: 10));
if (response.statusCode == 200) {
final List<dynamic> data = json.decode(response.body);
return data.map((json) => UserModel.fromJson(json)).toList();
} else {
throw ServerException(message: 'Failed to fetch users');
}
}
Future<UserModel> createUser(Map<String, dynamic> data) async {
final response = await _client.post(
Uri.parse('$_baseUrl/users'),
headers: _headers,
body: json.encode(data),
).timeout(Duration(seconds: 10));
if (response.statusCode == 201) {
return UserModel.fromJson(json.decode(response.body));
} else {
throw ServerException(message: 'Failed to create user');
}
}
Future<void> deleteUser(String id) async {
final response = await _client.delete(
Uri.parse('$_baseUrl/users/$id'),
headers: _headers,
).timeout(Duration(seconds: 10));
if (response.statusCode != 204) {
throw ServerException(message: 'Failed to delete user');
}
}
}
class AuthenticatedClient extends http.BaseClient {
final http.Client _inner;
final String Function() _getToken;
AuthenticatedClient(this._inner, this._getToken);
@override
Future<http.StreamedResponse> send(http.BaseRequest request) async {
final token = _getToken();
if (token.isNotEmpty) {
request.headers['Authorization'] = 'Bearer $token';
}
request.headers['Content-Type'] = 'application/json';
request.headers['Accept'] = 'application/json';
return _inner.send(request);
}
}
// Usage in bindings
Get.lazyPut<http.Client>(
() => AuthenticatedClient(
http.Client(),
() => Get.find<StorageService>().token ?? '',
),
);
try {
final response = await _client.get(url);
return parseResponse(response);
} on SocketException {
throw NetworkException();
} on TimeoutException {
throw ServerException(message: 'Request timeout');
} on FormatException {
throw ServerException(message: 'Invalid response format');
} catch (e) {
throw ServerException(message: e.toString());
}
npx claudepluginhub Kaakati/rails-enterprise-dev --plugin reactree-flutter-devIHttpClientFactory patterns with Polly for retries, circuit breakers, timeouts, and resilient HTTP communication. Includes best practices for HTTP client configuration and error handling. Use when configuring resilient HTTP clients in ASP.NET Core, implementing retry policies with Polly, or setting up circuit breakers for external service calls.
Provides Ktor client patterns for Android HTTP networking with content negotiation, timeouts, logging, authentication, API CRUD, and safe error handling.
Configures named, typed, and keyed HTTP clients with IHttpClientFactory in .NET 10, including DelegatingHandlers, resilience pipelines, and testing patterns.