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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 13:06:02