Flutter使用Dio添加Token到请求头时遭遇HttpException连接关闭问题
Flutter Dio添加Token请求头报错问题排查方案
可能的问题点及解决办法
1. 请求头格式不规范
Postman里的Token一般是Bearer {token}格式,你得检查Dio里的Authorization字段是不是严格这么写的——别漏了Bearer,也别多打空格。
- 正确写法示例:
options.headers['Authorization'] = 'Bearer $yourToken';
2. Dio全局配置冲突
要是你给Dio实例加了全局拦截器,说不定拦截器里也处理了Authorization字段,和你手动加的头冲突了,要么重复要么被覆盖。
- 解决:检查全局拦截器的代码,去掉重复的Authorization设置,或者保证手动添加的优先级更高。
3. Token特殊字符编码问题
Token里如果有+/=这类特殊字符,Postman会自动处理编码,但Dio可能不会,直接拼进去就会出错。
- 解决:先对Token做URL编码再拼接:
import 'dart:convert'; // ... String encodedToken = Uri.encodeComponent(yourToken); options.headers['Authorization'] = 'Bearer $encodedToken';
4. 目标端点的特殊验证要求
虽然Token在其他端点和Postman能用,但这个目标端点可能对Token的时效、权限范围,甚至请求头的大小写有特殊要求——比如人家要求authorization全小写,你写Authorization就不行。
- 解决:
- 把Dio的请求头和Postman的对比,确保键名完全一致;
- 查一下目标端点需要的权限Scope,确认你的Token包含这个权限。
5. Dio版本bug
有些旧版Dio处理请求头时存在bug,比如长Token的解析异常。
- 解决:把Dio更到最新稳定版,在
pubspec.yaml里改:dio: ^5.4.0+1 # 换成当前最新版本号
6. 设备网络代理残留
就算关了Android Studio的代理,手机系统本身可能还开着代理,导致请求被篡改。
- 解决:
- 关掉手机的系统代理;
- 切手机流量试试,排除WiFi代理的影响。
调试小技巧
- 打印完整请求头,和Postman的对比找差异:
print(options.headers); - 加个日志拦截器,看实际发出去的请求到底是什么样:
dio.interceptors.add(LogInterceptor(requestHeader: true));
内容的提问来源于stack exchange,提问作者Anwar Sh
相关产品推荐
相关产品推荐

