Dart中使用Provider带授权头的HTTP GET请求失效,Postman测试正常
问题排查与修复方案
1. 授权头格式错误(最可能的核心问题)
绝大多数HTTP JWT授权要求请求头的Authorization字段格式为 Bearer <你的token>,你当前代码直接传递token值,缺少Bearer 前缀,和Postman里手动填写的格式不一致,所以服务端会返回401未授权。
修复代码:
final response = await http.get( Uri.parse(url), headers: {HttpHeaders.authorizationHeader: "Bearer ${token!}"}, );
如果你的授权方案不是Bearer,换成Postman里使用的对应前缀即可
2. FutureBuilder重复触发请求死循环
你在build方法里直接调用Provider.of<Announcements>(context).fetchAnnouncements()作为future,同时Provider.of默认开启监听,fetchAnnouncements执行完调用notifyListeners会触发widget重绘,重绘又会再次调用fetchAnnouncements,陷入无限请求的死循环。
修复:调用Provider时关闭监听:
future: Provider.of<Announcements>(context, listen: false).fetchAnnouncements(),
3. 缺少HTTP状态码校验
你没有判断请求的响应状态码直接解析body,当授权失败、服务端报错时返回的非JSON结构会直接抛出解析异常,建议增加校验逻辑:
final response = await http.get( Uri.parse(url), headers: {HttpHeaders.authorizationHeader: "Bearer ${token!}"}, ); // 增加状态码判断 if (response.statusCode != 200) { throw Exception("请求失败,状态码:${response.statusCode}"); } final extractedData = json.decode(response.body);
4. ProxyProvider实例重建问题
你当前的ChangeNotifierProxyProvider的update逻辑每次都新建Announcements实例,会丢失之前的状态,推荐复用原有实例更新参数,修改如下:
ChangeNotifierProxyProvider<Auth, Announcements>( create: (_) => Announcements(null, []), update: (_, auth, previousAnnouncements) { previousAnnouncements?.token = auth.token; return previousAnnouncements ?? Announcements(auth.token, []); }, )
同时要把Announcements类里的token属性调整为可修改,保证可以直接更新token值不需要重建实例。
5. 代码语法缺失
你贴出的Announcements类的fetchAnnouncements方法末尾缺少两个闭合的大括号,一个对应方法、一个对应类,检查实际代码里是否漏写。
内容的提问来源于stack exchange,提问作者Edward Tanoto

