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
相关产品推荐
相关产品推荐

