request method

  1. @override
Future<AdapterResponse> request(
  1. AdapterRequest request
)
override

Executes an HTTP request.

This is the core method that performs the actual HTTP request using the underlying HTTP client library.

Parameters:

  • request: The request configuration containing URL, method, headers, body, etc.

Returns a Future that completes with an AdapterResponse containing the response data, status code, headers, etc.

Throws AdapterException if the request fails due to timeout, network error, or other issues.

Example:

final request = AdapterRequest(
  baseUrl: 'https://api.example.com',
  path: '/users/123',
  method: HttpMethod.get,
);
final response = await adapter.request(request);
print('Status: ${response.statusCode}');
print('Data: ${response.data}');

Implementation

@override
Future<AdapterResponse> request(AdapterRequest request) async {
  // 记录请求历史
  _requestHistory.add(request);

  // 创建 Completer 用于取消
  final completer = Completer<AdapterResponse>();

  // 如果有 cancelToken,注册取消回调
  if (request.cancelToken != null) {
    _registerCancelToken(request.cancelToken!, completer);

    // 如果已经取消,立即抛出异常
    if (request.cancelToken!.isCancelled) {
      throw AdapterException(
        type: AdapterExceptionType.cancel,
        message: request.cancelToken!.cancelReason ?? 'Request cancelled',
      );
    }
  }

  // 执行请求拦截器
  var modifiedRequest = request;
  for (final interceptor in _interceptors) {
    final handler = RequestInterceptorHandler();
     interceptor.onRequest(modifiedRequest, handler);

    if (handler.resolvedResponse != null) {
      _unregisterCancelToken(request.cancelToken, completer);
      return handler.resolvedResponse!;
    }
    if (handler.rejectedError != null) {
      _unregisterCancelToken(request.cancelToken, completer);
      throw handler.rejectedError!;
    }
    if (handler.modifiedRequest != null) {
      modifiedRequest = handler.modifiedRequest!;
    }
  }

  // 获取模拟配置
  final config = _mockConfigs[modifiedRequest.path];

  // 应用延迟
  if (config?.delay != null) {
    try {
      await Future.any([
        Future.delayed(config!.delay!),
        completer.future,
      ]);

      // 检查是否被取消
      if (completer.isCompleted) {
        throw await completer.future;
      }
    } catch (e) {
      _unregisterCancelToken(request.cancelToken, completer);
      rethrow;
    }
  }

  // 如果配置了错误,抛出错误
  if (config?.error != null) {
    var error = config!.error!;

    // 执行错误拦截器
    for (final interceptor in _interceptors) {
      final handler = ErrorInterceptorHandler();
       interceptor.onError(error, handler);

      if (handler.resolvedResponse != null) {
        _unregisterCancelToken(request.cancelToken, completer);
        return handler.resolvedResponse!;
      }
      if (handler.modifiedError != null) {
        error = handler.modifiedError!;
      }
    }

    _unregisterCancelToken(request.cancelToken, completer);
    throw error;
  }

  // 返回模拟响应
  var response = config?.response ?? _createDefaultResponse(modifiedRequest);

  // 执行响应拦截器
  for (final interceptor in _interceptors) {
    final handler = ResponseInterceptorHandler();
     interceptor.onResponse(response, handler);

    if (handler.rejectedError != null) {
      _unregisterCancelToken(request.cancelToken, completer);
      throw handler.rejectedError!;
    }
    if (handler.modifiedResponse != null) {
      response = handler.modifiedResponse!;
    }
  }

  _unregisterCancelToken(request.cancelToken, completer);
  return response;
}