Dio发起POST请求报错:'_InternalLinkedHashMap<String, dynamic>'不是String子类型
问题出现原因
Dio默认开启了自动响应解析逻辑,当服务端返回的响应头Content-Type为application/json时,Dio会自动将返回的JSON字符串解析为Map<String, dynamic>类型的对象,直接赋值给response.data。
而jsonDecode方法要求入参必须是原始JSON字符串,你把已经解析完成的Map对象传入jsonDecode,就会触发类型不匹配的报错。
解决方案
方案1:直接使用已解析的响应数据(推荐)
直接删除jsonDecode调用,直接使用response.data即可,代码修改如下:
class AuthenticationApi { final dio = Dio(BaseOptions(baseUrl: FlavorApi.getBaseUrl())); Future<dynamic> login( {required String email, required String password}) async { try { FormData formData = FormData.fromMap( {'email': email, 'password': password, 'ip': '127.0.0.1'}); final response = await dio.post( '/login?oauth_consumer_key=${FlavorApi.getConsumerKey()}&oauth_consumer_secret=${FlavorApi.getConsumerSecret()}', data: formData); // 直接使用response.data,已经是解析完成的Map var responseData = response.data; print('Data = $responseData'); } on DioError catch (e) { print(e.message); } } }
方案2:手动控制解析逻辑
如果你需要拿到原始JSON字符串自行解析,可以在请求配置中指定responseType为ResponseType.plain,此时response.data就是字符串类型,再调用jsonDecode就不会报错,修改代码如下:
final response = await dio.post( '/login?oauth_consumer_key=${FlavorApi.getConsumerKey()}&oauth_consumer_secret=${FlavorApi.getConsumerSecret()}', data: formData, // 指定返回原始字符串 options: Options(responseType: ResponseType.plain), ); var responseData = jsonDecode(response.data);
内容的提问来源于stack exchange,提问作者MD Sarfaraj
相关产品推荐
相关产品推荐

