У меня есть путь, который использует сложные модели с почти одинаковыми свойствами для каждого метода http. Проблема в том, что я хочу определить некоторые требуемые свойства для запроса PUT и POST, в то время как в ответе GET не требуются свойства (так как сервер всегда возвращает все свойства и упоминается в другом месте документации).
Я создал простой API кота, чтобы продемонстрировать, что я пробовал. Идея заключается в том, что для ответа GET модель ответа не имеет ничего, что требуется, но запрос PUT должен иметь имя для cat.
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.
Я также попробовал следующую версию PutCat:
PutCat:
type: object
required:
- name
allOf:
- $ref: "#/definitions/Cat"
Но теперь все необязательно.
Я не могу понять это. Есть ли способ сделать это правильно?
EDIT:
Как Helen, правильно упомянутый, я могу использовать readOnly
для решения этого конкретного случая с помощью GET и PUT.
Но скажем, я добавляю свойство breed
, которое должно быть предоставлено (в дополнение к свойству name
) для PUT. Затем я добавляю метод PATCH, который можно использовать для обновления либо breed
, либо name
, в то время как другой остается неизменным, и я не хочу устанавливать ни один из них по мере необходимости.