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

Flutter Retrofit如何忽略缺失的Content-Type,强制解析响应为JSON

解决Retrofit忽略Content-Type缺失强制解析JSON的问题

可以通过两种方式实现忽略Content-Type缺失,始终将响应解析为JSON:

方法一:通过Dio拦截器手动添加响应头

Retrofit基于Dio实现网络请求,我们可以给Dio添加响应拦截器,在响应返回时自动补充缺失的Content-Type: application/json头,让Retrofit按JSON格式解析。

  1. 创建拦截器类:
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);
  }
}
  1. 初始化Dio时添加拦截器:
final dio = Dio();
// 添加自定义拦截器
dio.interceptors.add(ForceJsonResponseInterceptor());

// 初始化Api实例
final api = Api(dio);

方法二:自定义转换器强制解析JSON

如果拦截器方式不满足需求,可以自定义Dio的转换器,直接将响应体按JSON格式解析,完全忽略响应头的影响。

  1. 创建自定义转换器:
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);
  }
}
  1. 替换Dio默认转换器:
final dio = Dio();
// 设置自定义转换器
dio.transformer = ForceJsonConverter();

// 初始化Api实例
final api = Api(dio);

注意事项

  • 确保API返回的内容确实是标准JSON格式,否则解析时会抛出异常,建议在代码中添加异常捕获逻辑。
  • 你的getRooms方法返回Future<List<String>>,需保证接口返回的JSON是字符串数组,若返回结构有嵌套,需调整返回类型或添加对应的实体类。

内容的提问来源于stack exchange,提问作者Хлопов Артем

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 21:25:24