You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中执行Head请求时出现400错误及异步异常排查

Flutter中Dio发起Head请求返回400错误的排查方向

我在Flutter项目里用Dio实现了Head请求,代码分层实现如下:

1. ApiService中的head方法定义

Future<Response> head(BuildContext context, String endUrl) async {
    mDio.options.baseUrl = apiBaseUrl;
    return await (_dio.head(endUrl)).catchError((e) {
      if (e.response.statusCode == 401) {
        // 跳转到登录页
      }
      /* else if (!checkSessionExpire(e, context)) {
        throw e;
      }*/
      else {
        throw e;
      }
    });
  }

2. AuthApiManager调用head方法

Future<Response?> headCallToGetModifiedDate(BuildContext context,String apiEndPoint) async{
    Response? response;
    Logger logger =Logger();
    try {
      response = await ApiService().head(context, apiEndPoint);
      logger.e("head call response >>  ${response.headers.value("").toString()}");
    }
    // ignore: avoid_catches_without_on_clauses
    on DioError catch(e)
    {
      response = (e.response);
      print("head call -------Exception----${e.toString()}");
    }
    return response;
  }

3. HomeProvider中调用请求方法

Future<void> headCall(BuildContext context,String endUrl) async{
if(await checkNetworkConnection(context))
{
  var resErrMsg = "";
  Response? response = await AuthApiManager().headCallToGetModifiedDate(context, endUrl);
  try{
    logger.e("Head Call Response >>   $response");
    print(">>>>last modified >>>  "+response!.headers.value("Last-Modified").toString());
    if(response.statusCode == 200)
    {
      print("status code 200");
    }
    else {
      resErrMsg = response.statusMessage!.toString();
      logger.e("...head call..Response else..$response");
    }
  }
  catch (e)
  {
    logger.e("-----Error---headcall----" + e.toString());
  }
}

触发的错误日志

I/flutter (30309): API call : headers {Authorization: Bearer }
I/flutter (30309): API call : http://s3.ap-south-naws.com/file.json
I/flutter (30309): API call : queryParameters {}
I/flutter (30309): API call : null
I/flutter (30309): medium true
I/flutter (30309): API call : Http status error [400]
I/flutter (30309): API call :

I/flutter (30309): head call -------Exception----DioError [DioErrorType.response]: Http status error [400]
I/flutter (30309): Source stack:
I/flutter (30309): #0 DioMixin.fetch (package:dio/src/dio_mixin.dart:488:35)
I/flutter (30309): #1 DioMixin.request (package:dio/src/dio_mixin.dart:483:12)
I/flutter (30309): #2 DioMixin.head (package:dio/src/dio_mixin.dart:179:12)
I/flutter (30309): #3 ApiService.head (package:mahotsav/src/apis/api_service.dart:211:24)
I/flutter (30309): #4 AuthApiManager.headCallToGetModifiedDate (package:mahotsav/src/apis/apimanagers/auth/auth_api_manager.dart:39:37)
I/flutter (30309): #5 HomeProvider.headCall (package:mahotsav/src/framework/dataProvider/Home/homeProvider.dart:1741:51)

I/flutter (30309): #6 _HomeScreenState.initState. (package:mahotsav/src/ui/home/home_screen.dart:68:9)

可能的错误原因

  • Authorization头无效:日志显示Authorization: Bearer ,Bearer后没有携带有效token,S3服务器会判定请求非法,返回400。
  • 请求URL拼写错误:目标URL的域名ap-south-naws.com疑似拼写错误,S3的正规域名格式应为ap-south-1.amazonaws.com,错误域名会导致服务器无法识别请求。
  • 存储桶权限配置问题:即使URL和token正确,若S3存储桶未开放Head请求权限,或当前身份无文件读取权限,也会返回400错误,需检查Bucket Policy或IAM权限。
  • 请求头缺失:部分服务器要求Head请求携带特定头信息(如Content-Type),若Dio实例未配置这些必要头,也可能触发400错误。

内容的提问来源于stack exchange,提问作者Jaimin Modi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 04:50:33