移除引用

有时,在 OpenAPI 描述 (OAD) 中移除引用很有用。一个常见的用例是与不理解引用的工具配合使用。然而,这并不总是直观的,本页介绍了需要注意的主要点。

将 OAD 转换为不含任何引用的单文档形式

并非所有 OAD 都可以转换,但在许多情况下,可以在不出现问题的情况下进行转换。

困难的情况包括

  • JSON Schema 中的循环引用**无法**移除,尽管如果引用跨文档,则可以将它们缩减为单个文档中的相同文档引用
  • 虽然 OAS 3.1 Schema 对象中的动态引用从技术上讲可以转换为静态引用,但它可能会以指数方式增加模式大小 (pdf)
  • OAS 3.1 Schema 对象、OAS 3.0 引用对象以及 OAS 3.0 和 3.1 路径项对象都允许在"$ref" 旁边使用关键字,每个关键字的语义略有不同;通用的引用移除工具,尤其是那些在 OAS 3.1 之前的工具,可能会在移除引用时无法保留行为
  • 在使用"$id" 的 OAS 3.1 Schema 对象中,没有意识到"$id" 的引用移除工具会错误地解析受"$id" 影响的引用
  • 链接对象的"operationRef" 无法替换为内联操作对象(尽管如果目标操作对象在 OAD 中具有唯一的"operationId",那么"operationRef" 可以替换为"operationId"
  • 鉴别器对象的"mapping" 字段禁止内联 Schema 对象;URI 引用值可以用组件对象的"schemas" 部分中的名称替换,但当鉴别器对象在引用的文档中时,如何解析这些名称存在歧义
  • 当使用由标准组织等第三方发布的组件时,工具可能会依赖于引用 URI 来识别标准组件;虽然此用法目前不常见,但随着 OpenAPI 被更多标准机构采用,它可能会变得更加普遍

如果您的 OAD 没有违反上述任何困难,那么您可以生成一个无引用的单文档 OAD,并且有一些工具可以做到这一点(但请参阅下一节中的注意事项)。

将多文档 OAD 转换为单文档

即使无法移除所有引用,也可以将多文档 OAD 转换为单文档。但是,具体取决于您的多文档 OAD 的结构方式,这可能比仅仅移除引用更复杂。遗憾的是,原因在于关于如何解析多文档 OAD 的令人痛苦地模糊和技术上的歧义。OpenAPI Initiative 希望在规范的未来版本中澄清这一点。

  • 链接对象的"operationId" 可以指向路径项对象中从不引用的操作对象;不清楚此情况应如何处理,这也是 OAS 本身建议不要在多文档 OAD 中使用"operationId" 的原因之一
  • 安全方案对象从不引用,只在安全需求对象中命名,必须予以考虑
  • 在 OAS 3.0 中,没有标准位置可以放置引用的路径项对象
  • 在多文档 OAD 中,服务器配置和安全设置的解析可能不明确

同样,在许多情况下,这些都没有问题,并且有一些工具可以满足您的需求。