Flutter中执行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

