跳转到主要内容
当你的 API 接受多种数据格式、包含条件字段或采用继承模式时,OpenAPI 的 schema 组合关键字可以帮助你记录这些灵活的结构。通过使用 oneOfanyOfallOf,你可以描述既能处理不同输入类型、又能将多个 schema 组合成完整数据模型的 API。

oneOf, anyOf, allOf 关键字

对于复杂数据类型,OpenAPI 提供了用于组合 schema 的关键字:
  • allOf:将多个 schema 组合在一起(类似合并对象或扩展基础 schema)。作用相当于 and 运算符。
  • anyOf:接受与提供的任一 schema 匹配的数据。作用相当于 or 运算符。
  • oneOf:只接受与提供的 schema 中恰好一个匹配的数据。作用相当于 exclusive-or 运算符。
Mintlify 会将 oneOfanyOf 以相同方式处理,因为二者在实际使用 API 时的差异很少产生影响。
有关这些关键字的详细规范,请参见 OpenAPI 文档
not 关键字目前不受支持。

使用 allOf 组合 schema

当你使用 allOf 时,Mintlify 会对你的 OpenAPI 文档进行一些预处理,以便以更易读的方式展示复杂的组合。例如,当你用 allOf 组合两个对象 schema 时,Mintlify 会将两者的属性合并为一个对象。当你利用 OpenAPI 的可复用 components 时,这一点尤其有用。
org_with_users:
  allOf:
    - $ref: '#/components/schemas/Org'
    - type: object
      properties:
        users:
          type: array
          description: 包含组织中所有用户的数组
# ...
components:
  schemas:
    Org:
      type: object
      properties:
        id:
          type: string
          description: 组织的 ID
org_with_users
object

使用 oneOfanyOf 提供选项

当你使用 oneOfanyOf 时,选项会显示在标签页容器中。请在每个子架构中指定一个 title 字段,为各个选项命名。例如,以下演示如何展示两种不同类型的送货地址:
delivery_address:
  oneOf:
    - title: StreetAddress
      type: object
      properties:
        address_line_1:
          type: string
          description: 收件人的街道地址
        # ...
    - title: POBox
      type: object
      properties:
        box_number:
          type: string
          description: 邮政信箱的号码
        # ...
delivery_address
object
  • StreetAddress
  • POBox
address_line_1
string
住址的街道
I