Connexion升级2.13.1后未配置x-body-name仍触发弃用警告咨询
近期升级connexion到2.13.1版本后运行单元测试出现如下弃用警告:
DeprecationWarning: x-body-name within the requestBody schema will be deprecated in the next major version. It should be provided directly under the requestBody instead.
这个警告是connexion 2.13.1版本本身的代码逻辑bug导致的误报,你没有遗漏任何配置要求,也没有在不知情的情况下使用已弃用特性。
官方新增这段告警的初衷,是为了兼容历史版本的配置习惯:早期connexion支持在requestBody.schema层级下配置x-body-name参数,下个大版本会移除这个兼容逻辑,要求用户把该参数直接配置在requestBody根层级下,所以加了告警做提前提醒。
但代码里的告警触发条件写得有问题,对应核心逻辑如下:
x_body_name = sanitize(self.request_body.get('x-body-name', None)) if not x_body_name: # x-body-name also accepted in the schema field for legacy connexion compat warnings.warn('x-body-name within the requestBody schema will be deprecated in the ' 'next major version. It should be provided directly under ' 'the requestBody instead.', DeprecationWarning) x_body_name = sanitize(self.body_schema.get('x-body-name', 'body'))
按照现有代码逻辑,只要requestBody根层级没有配置x-body-name,就会直接触发告警,完全没有判断schema层级下是否真的存在x-body-name配置。但实际上x-body-name本身就是可选参数,绝大多数用户不会手动配置这个字段,都是直接使用默认值body,这就导致所有没手动在requestBody根层级加该参数的接口,都会无差别触发这个弃用警告。你修改源码调整触发条件、仅当schema层级确实定义了x-body-name时才抛警告的思路是完全正确的,就是官方代码该有的逻辑。
- 方法一:直接忽略该告警,等官方后续小版本修复这个逻辑缺陷即可,不会影响现有业务的正常运行
- 方法二:如果不想在单元测试里看到这类告警,可以在所有接口的
requestBody根层级手动添加x-body-name: body配置,取值和框架默认值保持一致,不会对接口逻辑产生任何影响。
内容的提问来源于stack exchange,提问作者Motti

