api_response_timer 0.1.0
api_response_timer: ^0.1.0 copied to clipboard
A lightweight HTTP client wrapper that measures API response times with detailed timing metrics.
api_response_timer #
A lightweight HTTP client wrapper that measures API response times with detailed timing metrics.
Features #
- Wraps any
http.Clientusing the standardBaseClientinterface - Measures elapsed time from request send to full response body received
- Captures URL, HTTP method, status code, response time, and response size
- Preserves original response behavior (response body remains fully readable)
- Uses deterministic timing with
Stopwatch
Installation #
Add to your pubspec.yaml:
dependencies:
api_response_timer: ^0.1.0
Usage #
import 'package:api_response_timer/api_response_timer.dart';
void main() async {
final client = TimedClient(
onComplete: (timing) {
print('Request: ${timing.method} ${timing.url}');
print('Status: ${timing.statusCode}');
print('Response time: ${timing.responseTime.inMilliseconds}ms');
print('Response size: ${timing.responseSize} bytes');
},
);
final response = await client.get(Uri.parse('https://api.example.com/data'));
print('Body: ${response.body}');
client.close();
}
Using with an existing client #
import 'package:http/http.dart' as http;
import 'package:api_response_timer/api_response_timer.dart';
void main() async {
final innerClient = http.Client();
final timedClient = TimedClient(
inner: innerClient,
onComplete: (timing) {
print('${timing.method} ${timing.url} - ${timing.responseTime.inMilliseconds}ms');
},
);
final response = await timedClient.post(
Uri.parse('https://api.example.com/items'),
body: '{"name": "test"}',
headers: {'Content-Type': 'application/json'},
);
print('Created: ${response.body}');
timedClient.close();
}
Collecting metrics #
import 'package:api_response_timer/api_response_timer.dart';
class MetricsCollector {
final List<ApiTiming> _timings = [];
void record(ApiTiming timing) {
_timings.add(timing);
}
double get averageResponseTimeMs {
if (_timings.isEmpty) return 0;
final total = _timings.fold<int>(
0,
(sum, t) => sum + t.responseTime.inMilliseconds,
);
return total / _timings.length;
}
}
void main() async {
final collector = MetricsCollector();
final client = TimedClient(
onComplete: collector.record,
);
await client.get(Uri.parse('https://api.example.com/users'));
await client.get(Uri.parse('https://api.example.com/posts'));
print('Average response time: ${collector.averageResponseTimeMs}ms');
client.close();
}
API Reference #
TimedClient #
TimedClient({
http.Client? inner,
required OnTimingComplete onComplete,
})
inner: Optional existinghttp.Clientto wrap. If not provided, creates a new client.onComplete: Callback invoked after each request with timing metrics.
ApiTiming #
Immutable data model containing:
| Property | Type | Description |
|---|---|---|
url |
Uri |
The request URL |
method |
String |
HTTP method (GET, POST, etc.) |
statusCode |
int |
HTTP status code |
responseTime |
Duration |
Time from request to response received |
responseSize |
int |
Response body size in bytes |
License #
MIT License