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

时间:2016-09-25 05:52:22

标签: swagger swagger-2.0 swagger-editor openapi swagger-tools

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

  

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

我的困惑/问题:

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

到目前为止我尝试了什么:

  • 我尝试使用swagger-editor和相同文档中的示例(也在下面提到),使用此属性来查看是否可以看到它的任何特殊行为。我更改了属性,将其删除,并将Dog模型扩展到更深层次并在新的子模型上尝试相同,但我没有看到swagger-editor预览中的任何更改。 / LI>
  • 我尝试在线搜索,特别是stackoverflow问题,但没有找到任何相关信息。

我用来做实验的示例代码:

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 个答案:

答案 0 :(得分:10)

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

就像您的示例代码一样,Pet是超级类型,其属性petType标识为discriminator,而CatPet的子类型}。以下是Cat对象的json示例:

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

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

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

如果模型具有用于确定类型的属性,则可以使用

discriminator。在这种情况下,它自然适合,它可以用作其他开发人员理解多态关系的指标。如果考虑使用ReDoc支持discriminator的第三方工具(请参阅此gifexample中的petType),您可能会觉得这很有用。

答案 1 :(得分:4)

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

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

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