Flutter中http post请求携带Authorization Token不生效如何解决
问题排查与解决方法
首先纠正一个认知错误:你打印的response.headers是服务端返回给客户端的响应头,完全无法证明你的请求没有携带Authorization头,要确认请求头是否正确发出,需要通过抓包工具(Charles、Fiddler)或者在服务端打印接收到的请求头来验证。
以下是该问题的常见原因和对应解决方案:
- 请求头大小写不匹配
绝大多数后端服务、反向代理、鉴权中间件对Authorization头的大小写敏感,你当前代码中使用的是小写的authorization,请修改为规范的首字母大写写法:
var token='somethings'; response = await http.post(uri, headers: { 'Content-Type': 'application/json; charset=UTF-8', 'Accept': 'application/json', 'Authorization': 'Bearer $token', // 修改为首字母大写 }, body: jsonEncode(account[i]));
- 重定向自动丢弃鉴权头
如果你的请求地址配置了301/302重定向,dart的http包默认开启自动跟随重定向,重定向后的新请求会自动丢弃Authorization头避免信息泄露。你可以关闭自动跟随重定向验证是否是该问题:
var request = http.Request('POST', uri) ..headers.addAll({ 'Content-Type': 'application/json; charset=UTF-8', 'Accept': 'application/json', 'Authorization': 'Bearer $token', }) ..body = jsonEncode(account[i]) ..followRedirects = false; var response = await http.Response.fromStream(await request.send());
如果关闭重定向后接口返回3xx状态码,说明是重定向导致的头丢失,直接使用重定向后的最终地址发起请求即可解决。
- Token变量异常
发送请求前打印token变量值,确认变量不为空、不包含异常换行/特殊字符,同时确认Bearer和token之间的空格没有被省略,符合鉴权规范格式。
内容的提问来源于stack exchange,提问作者maliha arash
相关产品推荐
相关产品推荐

