我有一条路径,它使用每个 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(使用前将#替换为@)