Flutter Retrofit如何忽略缺失的Content-Type,强制解析响应为JSON
解决Retrofit忽略Content-Type缺失强制解析JSON的问题
可以通过两种方式实现忽略Content-Type缺失,始终将响应解析为JSON:
方法一:通过Dio拦截器手动添加响应头
Retrofit基于Dio实现网络请求,我们可以给Dio添加响应拦截器,在响应返回时自动补充缺失的Content-Type: application/json头,让Retrofit按JSON格式解析。
- 创建拦截器类:
class ForceJsonResponseInterceptor extends Interceptor { @override void onResponse(Response response, ResponseInterceptorHandler handler) { // 检查响应头是否存在Content-Type,不存在则添加 if (!response.headers.map.containsKey('Content-Type')) { response.headers.add('Content-Type', 'application/json'); } super.onResponse(response, handler); } }
- 初始化Dio时添加拦截器:
final dio = Dio(); // 添加自定义拦截器 dio.interceptors.add(ForceJsonResponseInterceptor()); // 初始化Api实例 final api = Api(dio);
方法二:自定义转换器强制解析JSON
如果拦截器方式不满足需求,可以自定义Dio的转换器,直接将响应体按JSON格式解析,完全忽略响应头的影响。
- 创建自定义转换器:
class ForceJsonConverter extends DefaultTransformer { @override Future<Object?> transformResponse( RequestOptions options, ResponseBody response) async { // 直接将响应内容转为字符串后解析为JSON final responseStr = await response.stream.bytesToString(); return const JsonDecoder().convert(responseStr); } }
- 替换Dio默认转换器:
final dio = Dio(); // 设置自定义转换器 dio.transformer = ForceJsonConverter(); // 初始化Api实例 final api = Api(dio);
注意事项
- 确保API返回的内容确实是标准JSON格式,否则解析时会抛出异常,建议在代码中添加异常捕获逻辑。
- 你的
getRooms方法返回Future<List<String>>,需保证接口返回的JSON是字符串数组,若返回结构有嵌套,需调整返回类型或添加对应的实体类。
内容的提问来源于stack exchange,提问作者Хлопов Артем
相关产品推荐
相关产品推荐

