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 {
// 创建 Completer 用于取消 / Create Completer for cancellation
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',
);
}
}
try {
// 执行请求拦截器
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!;
}
}
// 构建 URI
final uri = _buildUri(modifiedRequest);
// 构建头部
final headers = _buildHeaders(modifiedRequest);
// 构建请求体
final body = _buildBody(modifiedRequest);
// 执行 HTTP 请求(使用 Future.any 支持取消)
http.Response httpResponse;
final requestFuture = _executeRequest(modifiedRequest.method, uri, headers, body);
if (request.cancelToken != null) {
httpResponse = await Future.any([
requestFuture,
completer.future.then((_) => throw AdapterException(
type: AdapterExceptionType.cancel,
message: request.cancelToken!.cancelReason ?? 'Request cancelled',
)),
]);
} else {
httpResponse = await requestFuture;
}
// 转换响应
var response = _convertFromHttpResponse(httpResponse, modifiedRequest);
// 检查是否是错误响应
if (!response.isSuccess) {
final exception = AdapterException(
message: 'HTTP ${response.statusCode}: ${response.statusMessage ?? ""}',
type: AdapterExceptionType.response,
statusCode: response.statusCode,
response: response,
);
// 执行错误拦截器
var modifiedException = exception;
for (final interceptor in _interceptors) {
final handler = ErrorInterceptorHandler();
interceptor.onError(modifiedException, handler);
if (handler.resolvedResponse != null) {
_unregisterCancelToken(request.cancelToken, completer);
return handler.resolvedResponse!;
}
if (handler.modifiedError != null) {
modifiedException = handler.modifiedError!;
}
}
_unregisterCancelToken(request.cancelToken, completer);
throw modifiedException;
}
// 执行响应拦截器
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;
} on AdapterException {
_unregisterCancelToken(request.cancelToken, completer);
rethrow;
} catch (e, stackTrace) {
_unregisterCancelToken(request.cancelToken, completer);
var exception = _convertException(e, stackTrace);
// 执行错误拦截器
for (final interceptor in _interceptors) {
final handler = ErrorInterceptorHandler();
interceptor.onError(exception, handler);
if (handler.resolvedResponse != null) {
return handler.resolvedResponse!;
}
if (handler.modifiedError != null) {
exception = handler.modifiedError!;
}
}
throw exception;
}
}