如何在OpenAPI3 YAML规范中编写BOM字符解决CSV接口Dredd测试失败问题
问题解决:OpenAPI3 YAML 配置CSV带UTF-8 BOM的Dredd兼容方案
方案1:使用双引号字符串转义BOM(最推荐,兼容性最好)
你之前的\ufeff写法不生效,核心原因是YAML的块标量(|-开头的多行字符串)默认不解析转义序列,写在里面的\ufeff会被当成6个普通字符处理,不会转义为实际的BOM字符。
你可以改用双引号包裹示例字符串,YAML的双引号字符串支持Unicode转义,修改后的配置如下:
responses: "200": description: ffffoo content: text/csv;charset=UTF-8: schema: type: string example: "\ufeffa;b;c\n1;2;3\n4;5;5"
方案2:直接在块标量中插入实际BOM字符
如果需要保留多行块标量的可读性,你可以用支持UTF-8编码的编辑器(如VS Code),直接在a;b;c的最前方插入U+FEFF字符(即UTF-8 BOM)即可,修改后的配置如下:
responses: "200": description: ffffoo content: text/csv;charset=UTF-8: schema: type: string example: |- a;b;c 1;2;3 4;5;5
注意:插入的BOM是不可见字符,编辑器默认不会显示,需要用编码查看工具确认,该方案的缺点是协作时容易被误删。
兜底方案:用Dredd自定义钩子处理BOM差异
如果以上两种配置方案都不生效,你可以添加Dredd自定义钩子,在校验前统一处理BOM差异,比如给预期结果补BOM,或者移除实际响应的BOM,二选一即可:
// Dredd钩子示例 const hooks = require('hooks'); hooks.beforeValidation('/你的接口路径 > 200', (transaction) => { // 方式1:给预期响应加上BOM if (!transaction.expected.body.startsWith('\ufeff')) { transaction.expected.body = '\ufeff' + transaction.expected.body; } // 方式2:移除实际响应的BOM // transaction.real.body = transaction.real.body.replace(/^\ufeff/, ''); });
内容的提问来源于stack exchange,提问作者Paflow
相关产品推荐
相关产品推荐

