26

我正在用 yaml 写我的招摇定义。假设我有一个看起来像这样的定义。

paths:
  /payloads:
    post:
      summary: create a payload
      ...
      parameters:
      - in: body
        name: payload
        description: New payload
        required: true
        schema:
          $ref: "#/definitions/payload"
    put:
      summary: update a payload
      ...
      parameters:
      - in: body
        name: payload
        description: Updated existing payload
        required: true
        schema:
          $ref: "#/definitions/payload"
...
definitions:
  payload:
    properties:
      id:
        type: string
      someProperty:
        type: string
      ...

有没有一种方法可以表明有效负载的 id 属性对于 PUT 操作是必需的,并且对于 POST 操作是可选的(或根本不应该出现)?

4

3 回答 3

23

您必须单独定义模型。

但是,您可以选择排除和差异的情况。

如果您要排除,这是一个简单的情况,请创建一个具有排除属性的模型,例如ModelA. 然后定义ModelBas ModelAplus 附加属性:

ModelB:
  allOf:
    - $ref: "#/definitions/ModelA"
    - type: object
      properties:
        id:
          type: string

如果您要定义差异,请按照上面相同的方法,并排除idfrom ModelA。然后将ModelBand定义ModelC为扩展属性并将其ModelA添加id到它们,每个属性都有自己的限制。请注意,JSON Schema 可以让您在某些情况下遵循上面的原始示例来“覆盖”定义。但是,由于它并不是真正的覆盖,并且需要更好地理解 JSON Schema 的概念以免犯简单的错误,所以我建议现在走这条路。

于 2015-06-17T18:18:03.957 回答
0

我解决这个问题的方法是定义一个包含所有参数的“抽象”模型。然后对于每个用例,我将定义一个引用第一个用例的模型,并准确指出哪些是必填字段。

paths:
  /payloads:
    post:
      summary: create a payload
      ...
      parameters:
      - in: body
        name: payload
        description: New payload
        required: true
        schema:
          $ref: "#/definitions/NewPayload"
    put:
      summary: update a payload
      ...
      parameters:
      - in: body
        name: payload
        description: Updated existing payload
        required: true
        schema:
          $ref: "#/definitions/UpdatePayload"
...
definitions:
  # This payload would be used with update requests and has no required params.
  NewPayload:
     allOf:
       - { $ref: '#definitions/PayloadProperties }
       - type: object

  # This payload would be used with update requests and require an id param.
  UpdatePayload:
     allOf:
       - { $ref: '#definitions/PayloadProperties }
       - type: object
         required: [id]

  PayloadProperties:
    properties:
      id:
        type: string
      someProperty:
        type: string
      ...

我发现这种方法相当干净,因为它不需要重复,提供关注点和粒度的分离。

于 2018-03-21T15:49:17.003 回答
0

我现在遇到同样的问题。我的情况是,我试图覆盖模型的 requerid 块。但是没有用。=[ 然后,我记得我们可以添加 $ref 的新属性。因此,如果您为每种方法在模式上定义请求的字段,它就可以工作。像这样的事情(关注每个参考所需的块):

swagger: '2.0'
info:
  title: API
  version: 0.0.1
host: api.help.v1
basePath: /help
schemes:
- https
definitions:
  MyModel:
    description: 'Exemplo'
    type: object
    properties:
      field_1:
        type: string
      field_2:
        type: string
      field_3:
        type: string
paths:
  '/helps':
    post:
      description: ''
      summary: ''
      parameters:
        - in: body
          name: payload
          schema:
            type: object
            allOf:
            - $ref: '#/definitions/MyModel'
            required: 
            - field_1
      responses:
        '200':
          description: OK
        '400':
          description: N_OK
    put:
      description: ''
      summary: ''
      parameters:
        - in: body
          name: payload
          schema:
            type: object
            allOf: 
            - $ref: '#/definitions/MyModel'
            required: 
            - field_2
      responses:
        '200':
          description: OK
        '400':
          description: N_OK

externalDocs:
  description: Find out more about Swagger
  url: 'http://swagger.io'

哦!在 swagger 编辑器上仅通过模型视图显示: 在此处输入图像描述

我还没试过。但是应该可以这样定义模型。

于 2018-07-16T15:11:26.770 回答