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

如何让DIO自动解析Content-Type为text/html的响应JSON?

解决Dio解析Content-Type为text/html的JSON数据问题

下面提供几种更规范的实现方式,替代你当前的临时Interceptor方案:

方案1:自定义Dio Transformer(推荐)

Dio的Transformer专门负责请求/响应的数据转换,默认的DefaultTransformer仅解析Content-Type为application/json的响应。我们可以自定义Transformer,让它支持解析text/html类型的JSON:

import 'dart:convert';
import 'package:dio/dio.dart';

class HtmlJsonTransformer extends DefaultTransformer {
  @override
  Future transformResponse(
      RequestOptions options, ResponseBody response) async {
    // 获取原始响应数据
    final rawData = await super.transformResponse(options, response);
    // 判断响应头是否为text/html
    if (response.headers['content-type']?.contains('text/html') == true) {
      // 手动解析JSON
      return jsonDecode(rawData.toString());
    }
    // 其他类型按默认逻辑处理
    return rawData;
  }
}

// 初始化Dio时绑定自定义Transformer
Dio dio = Dio()..transformer = HtmlJsonTransformer();
CreateWord createWord = CreateWord(dio);

方案2:通过Interceptor修改响应头(简便适配)

无需手动解码,直接修改响应的Content-Type为application/json,让Dio默认的Transformer自动完成解析:

Dio dio = Dio()
    ..interceptors.add(InterceptorsWrapper(
      onResponse: (res, handler) {
        // 替换响应头的Content-Type
        res.headers['content-type'] = ['application/json'];
        handler.next(res);
      },
    ));
CreateWord createWord = CreateWord(dio);

这个方案比直接解码更贴合Dio的原生逻辑,后续涉及响应头的其他逻辑也能正常兼容。

方案3:针对单个接口适配

如果仅需要处理特定接口的text/html响应,可以在Interceptor中通过请求路径做判断:

Dio dio = Dio()
    ..interceptors.add(InterceptorsWrapper(
      onResponse: (res, handler) {
        // 仅处理/saveSet接口的响应
        if (res.requestOptions.path == '/saveSet') {
          res.headers['content-type'] = ['application/json'];
        }
        handler.next(res);
      },
    ));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 06:15:45