Flutter中使用client.post传递请求头报错,请求协助排查
解决Flutter中Refresh Token接口请求的Header错误
你的核心问题是对请求头做了不必要的JSON编码,http.post方法的headers参数要求传入Map<String, String>类型,而你错误地将headers转成了字符串,这是所有报错的根源。
错误原因拆解
首次报错:
The argument type 'String' can't be assigned to the parameter type 'Map<String, String>?'
你执行了两次json.encode(_headers),把原本的键值对Map转成了JSON字符串,和headers参数要求的类型完全不匹配,因此触发类型错误。强转报错:
_CastError (type 'String' is not a subtype of type 'Map<String, String>' in type cast)
字符串和Map是完全不同的类型,无法通过强制类型转换互相转换,这个操作本身就不成立。空引用报错:
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
相关产品推荐
相关产品推荐

