swagger 在OpenAPI 3中,我如何使用列Map到对象列表?

px9o7tmv  于 10个月前  发布在  其他
关注(0)|答案(1)|浏览(122)

我有一个看起来像这样的回应:

{
  resources: [ { arbitraryObject} ]
}

字符串
因此,我希望在响应部分为端点定义一个arbitraryObject
对于我的openapi 3.0模式,使用#/components/schemas/Resources来区分/cats端点的cat列表。以下是我目前为止的模式:

paths:
  /cats:
    get:
      responses:
        "200":
          description: "Gets all the cats"
          content:
            application/json:
              # use the discriminator column here to get a list of cats using the $ref: "#/components/schemas/Resources"
      
components:
  schemas:
    Resources:
      type: object
      properties:
        resources:
          type: array
          items:
            properties:
              objectType:
                type: string
          discriminator:
            propertyName: objectType
    Cat:
      type: object
      properties:
        objectType:
          type: string
          default: "Cat"
          example: "Cat"
    Dog:
      type: object
      properties:
        objectType:
          type: string
          default: "Dog"
          example: "Dog"


我问过ChatGPT,它想让我定义一个像这样的猫列表:

Cat:
      type: object
      allOf:
        - $ref: '#/components/schemas/Resources'
        - properties:
            objectType:
              type: string
              default: "Cat"
              example: "Cat"


但是这需要我为CatDog等的每个列表创建一个新的模式,所以我必须创建一个DogListCatList等,以及单独的CatDog,这是不切实际的。
我希望能够重用ResponsesCatDog来创建单个CatDog以及CatDog的列表。

qhhrdooz

qhhrdooz1#

我不明白这是怎么回事。
理由:objectType数据字段绑定到每个单独的对象(列表项)。因此对于/cats端点,狗列表或猫和狗的混合列表也将对模式有效,除非您显式地将objectType作为列表级别(而不是列表项级别)的模式中的可见数据字段。
我认为更好的设计是像这样显式地将objectType绑定到整个列表:

{
    "objectType": <string>,
    "resources": [ { "objectName": <object> } ]
}

字符串
这当然不同于您的响应示例-您可以选择更改此选项吗?

相关问题