request<T> method

  1. @override
Future<Result<T>> request<T>(
  1. String path, {
  2. required HttpMethod method,
  3. Object? body,
  4. Map<String, dynamic>? queryParameters,
  5. JsonParser<T>? parser,
  6. RequestOptions? options,
})
override

Sends a generic HTTP request. Core verbs delegate to this method.

Implementation

@override
Future<Result<T>> request<T>(
  String path, {
  required HttpMethod method,
  Object? body,
  Map<String, dynamic>? queryParameters,
  JsonParser<T>? parser,
  RequestOptions? options,
}) async {
  final effectiveBase = options?.baseUrl ?? _config.baseUrl;
  final uri = _buildUri(effectiveBase, path, queryParameters);
  final headers = _mergeHeaders(_config.defaultHeaders, options?.headers);
  final timeout = options?.timeout ?? _config.timeout;

  var ctx = RequestContext(
    uri: uri,
    method: method.value,
    headers: headers,
    body: body,
  );

  // --- request interceptors ---
  final skipInterceptors = options?.skipInterceptors ?? false;
  if (!skipInterceptors) {
    final result = await _runRequestInterceptors(ctx);
    if (result is Failure<RequestContext>) return Failure(result.error);
    ctx = (result as Success<RequestContext>).data;
  }

  // --- execute with optional retry ---
  return _executeWithRetry<T>(
    ctx: ctx,
    parser: parser,
    timeout: timeout,
    skipInterceptors: skipInterceptors,
    attemptsLeft: _config.maxRetries + 1,
  );
}