request method
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;
}