我有一条使用复杂模型的路径,每个 http 方法具有几乎相同的属性。问题是我想为 PUT 和 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 Editor 说这是一个有效的规范,但是name
根据 GET 和 PUT 的要求进行设置。Swagger UI 也是如此。
我还尝试了以下版本的 PutCat:
PutCat:
type: object
required:
- name
allOf:
- $ref: "#/definitions/Cat"
但现在一切都是可选的。
我想不通。有没有办法正确地做到这一点?
编辑:
正如Helen正确提到的,我可以使用readOnly
GET 和 PUT 来解决这个特殊情况。
但是假设我添加了必须为 PUTbreed
提供的属性(除了属性之外)。name
然后我添加 PATCH 方法,该方法可用于更新其中一个breed
或name
同时另一个保持不变,并且我不想根据需要设置任何一个。