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

Flutter中使用client.post传递请求头报错,请求协助排查

解决Flutter中Refresh Token接口请求的Header错误

你的核心问题是对请求头做了不必要的JSON编码,http.post方法的headers参数要求传入Map<String, String>类型,而你错误地将headers转成了字符串,这是所有报错的根源。

错误原因拆解

  1. 首次报错:The argument type 'String' can't be assigned to the parameter type 'Map<String, String>?'
    你执行了两次json.encode(_headers),把原本的键值对Map转成了JSON字符串,和headers参数要求的类型完全不匹配,因此触发类型错误。

  2. 强转报错:_CastError (type 'String' is not a subtype of type 'Map<String, String>' in type cast)
    字符串和Map是完全不同的类型,无法通过强制类型转换互相转换,这个操作本身就不成立。

  3. 空引用报错:Object reference not set to an instance of an object.
    大概率是前面的请求参数错误导致请求未正常发送,response对象为null;或者singleton中的token/refreshToken未初始化,存在空值。

修正后的代码

直接传递原始的headers Map即可,不需要任何编码:

Future<List<PetsList>> fetchPets(http.Client client) async {
  // 直接定义headers键值对,无需编码
  final _headers = {
    'Content-Type': 'application/json',
    'token': singleton.token ?? '', // 增加空值判断,避免空引用
    'refreshToken': singleton.refreshToken ?? '',
  };

  final response = await client.post(
    Uri.parse('$baseUrl/account/refreshtoken'),
    headers: _headers,
    // 若接口需要请求体,可在此添加body参数,比如body: json.encode({}),对照Postman配置调整
  );

  // 先判断请求是否成功,再处理响应内容
  if (response.statusCode == 200) {
    print(response.body);
    // 补充解析响应体为List<PetsList>的逻辑
    return List<PetsList>.from(json.decode(response.body).map((x) => PetsList.fromJson(x)));
  } else {
    throw Exception('刷新Token失败');
  }
}

额外注意事项

  • 对照Postman确认请求头格式:如果是Bearer Token,通常格式为Authorization: Bearer ${token},此时headers需要调整为:
    final _headers = {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer ${singleton.token ?? ''}',
      'refreshToken': singleton.refreshToken ?? '',
    };
    
  • 始终对singleton中的token/refreshToken做空值判断,避免空值导致请求异常。
  • 增加请求异常处理,比如网络错误、非200状态码的情况,避免后续逻辑报错。

内容的提问来源于stack exchange,提问作者VanCoon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 20:20:05