request<T> method

Future<Response<T>> request<T>(
  1. HttpRequestConfig config, {
  2. CancelToken? cancelToken,
})

执行 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;
  }
}