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

Flutter REST API认证请求返回400 Bad Request错误排查

问题

我在Flutter中实现了获取历史报价列表的REST API请求方法,代码如下:

static Future<RequestArray> requestQuotesListHistory(
      String url, Map bodyx) async {
    Map<String, String> _header = <String, String>{
      "Authorization": "Bearer $vToken",
    };
    try {
      print(_header);
      print(vToken);
      final response = await http.post(
        Uri.parse(url),
        headers: _header,
        
        body: bodyx,
      );
      if (200 == response.statusCode) {
        print(response.headers);
        var jsonString = response.body;
        print(jsonString);
        var jsonMap = json.decode(jsonString);
        print(jsonMap);
        var rqQuoteList = RequestArray();
        rqQuoteList = RequestArray.fromJson(jsonMap);
        return rqQuoteList;
      } else {
        return RequestArray();
      }
    } catch (e) {
      return RequestArray();
    }
  }

问题在于,我设置Authorization请求头时使用大小写敏感格式,但实际请求日志显示该字段被转为小写:

I/flutter (15684):
[user-agent] => Dart/2.19 (dart:io)
[content-type] => application/x-www-form-urlencoded; charset=utf-8
[accept-encoding] => gzip
[content-length] => 57
[authorization] => Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
[host] => api.ss.com

这导致API请求返回400 Bad Request错误,该如何解决?

解决方案

Dart的http包默认会将请求头的键转为小写(HTTP协议规范里请求头本应大小写不敏感,但部分不符合规范的API会强制要求特定大小写)。可以通过以下方式解决:

  • 使用HttpClient手动发送请求:绕开http包的自动转换逻辑,直接控制请求头的大小写,核心是设置preserveHeaderCase: true参数:
static Future<RequestArray> requestQuotesListHistory(String url, Map bodyx) async {
  final httpClient = HttpClient();
  try {
    final request = await httpClient.postUrl(Uri.parse(url));
    // 强制保留请求头的大小写格式
    request.headers.add("Authorization", "Bearer $vToken", preserveHeaderCase: true);
    // 设置请求体格式(根据实际需求调整)
    request.headers.contentType = ContentType.parse('application/x-www-form-urlencoded');
    // 格式化表单请求体
    final formData = bodyx.entries.map((entry) => 
      "${Uri.encodeComponent(entry.key)}=${Uri.encodeComponent(entry.value.toString())}"
    ).join("&");
    request.write(formData);
    
    final response = await request.close();
    if (response.statusCode == 200) {
      final jsonString = await response.transform(utf8.decoder).join();
      final jsonMap = json.decode(jsonString);
      return RequestArray.fromJson(jsonMap);
    } else {
      return RequestArray();
    }
  } catch (e) {
    return RequestArray();
  } finally {
    httpClient.close();
  }
}
  • 排查API是否真的大小写敏感:部分日志显示的小写可能只是日志输出的格式化结果,实际请求中头字段的大小写并未影响。可以先通过Postman等工具测试,确认API是否真的要求Authorization严格大写。

内容的提问来源于stack exchange,提问作者Mukesh kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 13:32:31