首页 文章

多态性中的“鉴别器”,OpenAPI 2.0(Swagger 2.0)

提问于
浏览
17

引用OpenAPI 2.0, Schema ObjectSwagger 2.0, Schema Object,以及 discriminator 字段的定义为:

添加对多态性的支持 . 鉴别器是架构属性名称,用于区分继承此架构的其他架构 . 必须在此模式中定义使用的属性名称,它必须位于必需的属性列表中 . 使用时,值必须是此架构的名称或继承它的任何架构 .

My confusions/ questions:

  • 这对我来说是模棱两可的,它在继承或多态中扮演的角色究竟是什么 . 有人可以用一个工作实例解释 discriminator ,显示它究竟做了什么以及如果我们不使用它会怎么样?某些操作依赖于它的任何错误,警告或任何工具?

  • 是否swagger-editor不支持 discriminator ,并且该字段用于其他一些工具?

What I have tried so far:

  • 我试图使用swagger-editor和相同文档中的示例(也在下面提到),来玩这个属性,看看我是否可以看到它的任何特殊行为 . 我更改了属性,删除了它,并将 Dog 模型扩展到更深层次并在新的子模型上尝试相同,但我没有看到swagger-editor预览中的任何更改 .

  • 我尝试在线搜索,特别是stackoverflow问题,但没有找到任何相关信息 .

The sample code I used to do experiments:

definitions:
  Pet:
    type: object
    discriminator: petType
    properties:
      name:
        type: string
      petType:
        type: string
    required:
    - name
    - petType
  Cat:
    description: A representation of a cat
    allOf:
    - $ref: '#/definitions/Pet'
    - type: object
      properties:
        huntingSkill:
          type: string
          description: The measured skill for hunting
          default: lazy
          enum:
          - clueless
          - lazy
          - adventurous
          - aggressive
      required:
      - huntingSkill
  Dog:
    description: A representation of a dog
    allOf:
    - $ref: '#/definitions/Pet'
    - type: object
      properties:
        packSize:
          type: integer
          format: int32
          description: the size of the pack the dog is from
          default: 0
          minimum: 0
      required:
      - packSize

2 回答

  • 2

    根据google groupdiscriminatorallOf 属性的顶部使用,并且它在超类型中定义为多态 . 如果未使用 discriminatorallOf 关键字将描述模型包含其他合成模型的属性 .

    就像在示例代码中一样, Pet 是超类型,其属性 petType 标识为 discriminatorCatPet 的子类型 . 以下是 Cat 对象的json示例:

    {
      "petType": "Cat",
      "name": "‎Kitty"
    }
    

    discriminator 的使用旨在指示用于标识对象类型的属性 . 假设有些工具可以使用 discriminator 正确支持定义对象,可以通过扫描属性来确定类型 . 例如,根据 petType 标识对象是 Cat .

    但是, discriminator 字段在当前版本的规范或样本中没有很好地定义(参见issue #403) . 据我所知,目前Swagger没有提供适当支持的工具 .

    如果模型具有用于确定类型的属性,则可以使用 discriminator . 在这种情况下,它自然适合,它可以用作其他开发人员理解多态关系的指标 . 如果考虑使用支持 discriminatorReDoc等第三方工具(请参阅gifexample中的 petType ),您可能会觉得这很有用 .

  • 7

    OpenApi 3中的鉴别器功能得到了很大改进 . 现在提供一个鉴别器对象,它包含鉴别器属性的名称,以及该属性值到模式名称的映射 .

    (我意识到你确实问过OpenApi 2,但是在3中有很多改进,希望你可以使用它) .

    请参阅:https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#discriminatorObject了解实际规格

相关问题