【问题标题】:Allow an object to have oneOf some types in swagger允许一个对象在招摇中拥有一个某些类型
【发布时间】:2017-09-27 11:30:56
【问题描述】:

我正在定义一个 API,并且我有一个名为“payload”的字段。我们将此字段定义为

“类型”:字符串

然而,在我们的招摇中,那些有效载荷数据开始具有结构。更具体地说,客户端发送 json 对象作为必须遵守某些规则的有效负载数据。例如有效载荷可以是:

{
  "bark": true,
  "breed": "Dingo" 
}

如果有效负载是 Dog 对象或

{
  "hunts": true,
  "age": 13 
}

如果是 Cat 对象。

所以在我最初拥有的 yaml 文件中:

payload:
        $ref: "#/definitions/payloaddata" 

在我的定义区域中:

payloaddata:
    type: "object"
    schema: 
      oneOf: 
        - $ref: '#/components/schemas/Cat'
        - $ref: '#/components/schemas/Dog'

组件定义为:

components:
  schemas:
    Dog:
      type: object
      properties:
        bark:
          type: boolean
        breed:
          type: string
          enum: [Dingo, Husky, Retriever, Shepherd]
    Cat:
      type: object
      properties:
        hunts:
          type: boolean
        age:
          type: integer

但是,yaml 文件不会使用此输入“编译”。任何想法如何做到这一点?

【问题讨论】:

  • 您的规范是 OpenAPI/Swagger 2.0 还是 OpenAPI 3.0? oneOf 仅在 3.0 中受支持。
  • 在文件顶部添加了招摇:“3.0”。我在 editor.swagger.io 工作
  • 是否有可能留在 2.0 中并允许参数具有多种类型作为值? editor.swagger dot io 不支持“3.0”
  • 1) 是openapi: 3.0.0,而不是swagger: '3.0'。 2) 不,2.0 不支持多类型值。
  • 谢谢@Helen,如果你愿意,可以回答这个问题。这是迁移到 openapi 的正确答案:3.0

标签: json api swagger swagger-2.0


【解决方案1】:

oneOf 在 OpenAPI 3.0 中受支持,但在 OpenAPI/Swagger 2.0 中不支持。只要您的规范指定openapi: 3.0.0 而不是swagger: '2.0',您发布的代码就可以了。您可能还需要更改规范中的其他一些内容,例如#/definitions/ -> #/components/schemas/... 等等。

【讨论】:

  • 我花了太多时间 才找到这个答案...谢谢!
【解决方案2】:

接受的解决方案对我不起作用:独立于声明 openapi: 3.0.0,模型定义未编译。

然而,这个对我有用:

定义:

  TestModel:
    type: object
    oneOf:
      - $ref: '#/components/schemas/Foo'
      - $ref: '#/components/schemas/Bar'

模型用法:

testmodel:
  $ref: '#/components/schemas/TestModel'

希望它对其他人有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-19
    • 2012-07-18
    • 2016-09-05
    • 1970-01-01
    • 2019-04-01
    • 2022-08-17
    • 2022-01-21
    • 2017-12-04
    相关资源
    最近更新 更多