使用OpenAPI Generator生成Flutter代码调用API时遇媒体类型错误
解决OpenAPI Generator生成Flutter代码调用接口时的媒体类型解析错误
问题背景
使用OpenAPI Generator基于YAML文件生成Flutter类后,调用AdminsApi的infoGet接口(GET请求,路径/info,基准地址https://localhost:8080/api)时,出现媒体类型解析错误:
Error on line 1, column 17: Invalid media type: expected no more input. ╷ 1 │ application/json, application/json; charset=utf-8
原因分析
错误提示的媒体类型值是两个application/json相关类型用逗号拼接的结果,不符合HTTP媒体类型规范,导致解析失败。大概率是生成的代码中重复设置了Accept请求头,或是OpenAPI YAML文件中接口的produces字段重复定义了相同的媒体类型。
解决方案
方案1:修改生成的Dart代码
找到生成的AdminsApi.dart文件中infoGet方法的请求头配置部分,将重复的媒体类型值改为单一有效值:
- 定位到类似如下的代码段:
final headerParams = <String, String>{}; headerParams['Accept'] = "application/json, application/json; charset=utf-8"; - 将
Accept头的值修改为单一的媒体类型,比如:
或headerParams['Accept'] = "application/json; charset=utf-8";headerParams['Accept'] = "application/json";
方案2:修正OpenAPI YAML文件并重新生成代码
检查YAML文件中/info接口的produces字段,删除重复的媒体类型定义:
- 找到接口定义:
paths: /info: get: produces: - application/json - application/json; charset=utf-8 # 其他接口配置 - 删除其中一个重复项,保留单一有效值:
produces: - application/json; charset=utf-8 - 重新使用OpenAPI Generator生成Flutter代码。
额外修正:异步调用处理
原测试代码中缺少await关键字,会导致打印Future实例而非接口返回的系统信息,需补充:
Future<void> _testCall() async { final api_instance = AdminsApi(); try { final result = await api_instance.infoGet(); // 添加await print(result); } catch (e) { print('Exception when calling AdminsApi->infoGet: $e\n'); } }
内容的提问来源于stack exchange,提问作者Anujan
相关产品推荐
相关产品推荐

