重用具有不同所需属性的模型

2023-12-08

我有一条路径,它使用每个 http 方法具有几乎相同属性的复杂模型。问题是我想定义somePUT 和 POST 请求所需的属性,而 GET 响应中不需要属性(因为服务器始终返回所有属性及其在文档其他地方提到的属性)。

我创建了一个简单的 cat API 来演示我所尝试的内容。这个想法是,对于 GET 响应,响应模型没有任何标记为必需的内容,但 PUT 请求必须有猫的名称。

swagger: "2.0"

info:
  title: "Cat API"
  version: 1.0.0

paths:
  /cats/{id}:
    parameters:
      - name: id
        in: path
        required: true
        type: integer
    get:
      responses:
        200:
          description: Return a cat
          schema:
            $ref: "#/definitions/GetCat"
    put:
      parameters:
        - name: cat
          in: body
          required: true
          schema:
            $ref: "#/definitions/PutCat"
      responses:
        204:
          description: Cat edited
            
definitions:
  Cat:
    type: object
    properties:
      name:
        type: string
  GetCat:
    allOf:
      - $ref: "#/definitions/Cat"
    properties:
      id:
        type: integer
  PutCat:
    type: object
    required:
      - name
    properties:
      $ref: "#/definitions/Cat/properties"

Swagger 编辑器说这是一个有效的规范,但是name根据 GET 和 PUT 的需要进行设置。 Swagger UI 也是如此。

我也尝试过以下版本PutCat:

PutCat:
  type: object
  required:
    - name
  allOf:
    - $ref: "#/definitions/Cat"

但现在一切都是可选的。

我无法弄清楚这一点。有没有办法正确地做到这一点?

EDIT:

As Helen正确提到,我可以使用readOnly使用 GET 和 PUT 解决这个特殊情况。

但假设我添加breed必须提供的财产(除了name属性)用于 PUT。然后我添加 PATCH 方法,该方法可用于更新breed or name而另一个保持不变,我不想根据需要设置其中任何一个。


在您的示例中,您可以对 GET 和 POST/PUT 使用单个模型,仅在 GET 响应中使用的属性标记为readOnly。来自spec:

readOnly

将属性声明为“只读”。这意味着它可以作为响应的一部分发送,但不得作为请求的一部分发送。标记为 readOnly 为 true 的属性不应位于已定义模式的必需列表中。默认值为 false。

规范看起来像:

    get:
      responses:
        200:
          description: Return a cat
          schema:
            $ref: "#/definitions/Cat"
    put:
      parameters:
        - name: cat
          in: body
          required: true
          schema:
            $ref: "#/definitions/Cat"
      responses:
        204:
          description: Cat edited

definitions:
  Cat:
    properties:
      id:
        type: integer
        readOnly: true
      name:
        type: string
      breed:
        type: string
    required:
      - name
      - breed

这意味着您必须将name and breed:

{
  "name": "Puss in Boots",
  "breed": "whatever"
}

and GET /cats/{id}必须返回name and breed并且还可能返回id:

{
  "name": "Puss in Boots",
  "breed": "whatever",
  "id": 5
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重用具有不同所需属性的模型 的相关文章

随机推荐