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

Flutter添加Authorization头请求报错但Postman同请求正常如何解决

根因定位

你遇到的报错本质是JSON解析异常,和Authorization请求头的代码语法无关,核心原因是添加该请求头后,服务端返回的响应内容不是合法JSON格式,你在后续代码中直接对响应体执行jsonDecode操作时触发崩溃。
移除Authorization头时服务端返回标准JSON格式的400错误,解析逻辑可正常处理;添加该头后服务端返回了非JSON内容(通常是HTML错误页、空响应、纯文本报错信息),JSON解析器无法识别才抛出FormatException。

排查步骤
  • 首先打印完整响应信息,不要直接做JSON解析。修改请求代码,优先输出响应状态码和原始响应体:
postData(data, apiUrl) async {
    var fullUrl = _url + apiUrl;
    var at = await _accessToken;
    print('access token is |$at|'); // 两侧加竖线排查不可见字符
    var response = await http.post(
      Uri.parse(fullUrl),
      body: jsonEncode(data),
      encoding: Encoding.getByName("utf-8"),
      headers: {
        'Authorization': 'Bearer ${at.trim()}', // 提前去掉token首尾空白字符
        'Content-Type': 'application/json',
        'Accept': 'application/json'
      },
    );
    // 新增排查日志
    print('响应状态码:${response.statusCode}');
    print('原始响应内容:${response.body}');
    print('响应Content-Type:${response.headers['content-type']}');
    // 确认格式合法再解析
    try {
      return jsonDecode(response.body);
    } catch (e) {
      print('JSON解析失败,错误信息:$e');
      return null;
    }
}
  • 检查accessToken是否携带不可见字符:打印token时在两侧加特殊符号(如上代码中的|),确认token首尾没有多余的空格、换行符、转义字符,这类字符打印时不可见,但会导致Authorization头格式错误,触发服务端返回非JSON报错。
  • 对比Postman与Flutter请求头差异:将Postman中该请求的所有请求头完整导出,和Flutter实际发送的请求头对比,部分服务端会校验User-Agent、Accept-Encoding等字段,缺失指定字段会返回HTML错误页。
常用解决方案
  • 若确认是token携带空白字符:构造Authorization头时统一调用trim()方法移除首尾不可见字符。
  • 若确认服务端返回HTML错误页:根据响应状态码做分支处理,比如状态码为401时跳转登录页,状态码为500时抛出服务端异常,不要强行解析非JSON内容。
  • 若确认是请求头缺失:补充Postman中存在但Flutter请求中缺少的头字段即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:45:04