如何让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
相关产品推荐
相关产品推荐

