request<T> method
执行 HTTP 请求
config 请求配置
cancelToken 可选的取消令牌
返回 Dio Response 对象,包含响应数据、状态码、头部等信息。
示例
try {
final response = await adapter.request<Map<String, dynamic>>(
HttpRequestConfig.get('/users/1'),
);
print('Status: ${response.statusCode}');
print('Data: ${response.data}');
} on DioException catch (e) {
print('Error: ${e.message}');
}
Implementation
Future<Response<T>> request<T>(
HttpRequestConfig config, {
CancelToken? cancelToken,
}) async {
try {
final base = dio.options;
final mergedHeaders = <String, dynamic>{
...base.headers,
...?config.headers,
...?config.extra?.headers,
};
final mergedQueryParameters = <String, dynamic>{
...base.queryParameters,
...?config.queryParameters,
};
final requestOptions = RequestOptions(
path: config.path,
method: _methodToString(config.method),
data: config.data,
queryParameters: mergedQueryParameters,
baseUrl: base.baseUrl,
connectTimeout: config.connectTimeout ?? base.connectTimeout,
sendTimeout: config.sendTimeout ?? base.sendTimeout,
receiveTimeout: config.receiveTimeout ?? base.receiveTimeout,
headers: mergedHeaders,
responseType:
config.responseType ??
config.extra?.responseType ??
base.responseType,
contentType:
config.contentType ?? config.extra?.contentType ?? base.contentType,
extra: {...base.extra, ...?config.extra?.extra},
cancelToken: cancelToken,
onSendProgress: config.onSendProgress,
onReceiveProgress: config.onReceiveProgress,
);
// 执行请求(使用 fetch 以支持 per-request connectTimeout)
final response = await dio.fetch<T>(requestOptions);
// 应用响应转换器
if (responseTransformer != null && response.data != null) {
final transformedData = responseTransformer!(response.data);
return Response<T>(
data: transformedData as T?,
statusCode: response.statusCode,
statusMessage: response.statusMessage,
headers: response.headers,
requestOptions: response.requestOptions,
redirects: response.redirects,
isRedirect: response.isRedirect,
extra: response.extra,
);
}
return response;
} on DioException catch (e) {
// 应用错误转换器
if (errorTransformer != null) {
throw errorTransformer!(e);
}
rethrow;
}
}