api_response_timer

A lightweight HTTP client wrapper that measures API response times with detailed timing metrics.

Features

  • Wraps any http.Client using the standard BaseClient interface
  • 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 existing http.Client to 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

Libraries

api_response_timer
A lightweight HTTP client wrapper that measures API response times.