如何将两个 openapi/swagger 模式组合成一个模式

Posted

技术标签:

【中文标题】如何将两个 openapi/swagger 模式组合成一个模式【英文标题】:How to combine two openapi/swagger schemas into one single schema 【发布时间】:2021-11-20 12:07:42 【问题描述】:

我在 openapi 文件中有两个架构:

SchemaA:
  type: object
  properties:
    property_a1: 
      type: string
    property_a2: 
      type: string

SchemaB:
  type: object
  properties:
    property_b1: 
      type: string
    property_b2: 
      type: string

我希望得到的架构是:

ResultantSchema:
  type: object
  properties:
    property_a1: 
      type: string
    property_a2: 
      type: string
    property_b1: 
      type: string
    property_b2: 
      type: string

我尝试过使用 allOf 操作符这样组合:

ResultantSchema:
  type: object
  properties:
    - $ref: '#/SchemaA'
    - $ref: '#/SchemaB'

但这会产生一个包含两个对象的模式的结果:

WrongResultantSchema:
 - type: object
    properties:
     property_a1: 
      type: string
     property_a2: 
      type: string
 - type: object
    properties:
     property_b1: 
       type: string
     property_b2: 
       type: string

哪里错了...有没有办法用一个对象而不是两个嵌套对象来实现结果模式?

【问题讨论】:

【参考方案1】:

以下是在 OpenAPI 3.0 中组合多个模式的方法:

ResultantSchema:
  allOf:
    - $ref: '#/components/schemas/SchemaA'
    - $ref: '#/components/schemas/SchemaB'

在 OpenAPI 2.0 (swagger: '2.0') 中:

ResultantSchema:
  allOf:
    - $ref: '#/definitions/SchemaA'
    - $ref: '#/definitions/SchemaB'

【讨论】:

不,这不起作用,它仍然在一个模式下显示两个对象。 你能添加一个错误的截图吗?

以上是关于如何将两个 openapi/swagger 模式组合成一个模式的主要内容,如果未能解决你的问题,请参考以下文章

如何注释 OpenAPI (Swagger) 2.0 中已弃用的字段?

如何在 OpenAPI / Swagger 中递归引用封闭类型定义?

如何在 OpenAPI (Swagger) 中为相同的 HTTP 状态代码定义不同的响应?

如何在 OpenAPI (Swagger) 中为同一路径定义不同的查询参数?

如何在 Apache Camels RouteBuilder.restConfiguration() 中添加 OpenApi/Swagger securitySchemes?

Sanic OpenAPI Swagger文档生成抛出属性路径operationId重复