Я пытаюсь создать ответ из множества компонентов схемы, используя OpenAPI 3. Ответ состоит из трех частей:
- Общий компонент, который используют другие конечные точки (т. Е. Success /флаги сбоя).-
#/components/schemas/core_response_schema
внутри allOf
. - Свойства, которые все отклики на использование этой конечной точки (т. Е.
user_id
) - компонент properties
ниже. - Одна из нескольких схем, которые будут различаться в зависимости от типа пользователя.- компонент
oneOf
.
Я определил, что должен использовать allOf
, чтобы иметь возможность смешивать свойства (элемент 2) и отклик ядра (элемент 1), хотя это выглядитнеправильно, так как есть только один элемент.Я попробовал $ref
, но он не сработал.
В приведенном ниже примере успешно проходят три различных инструмента линтинга OpenAPI, но в построенном примере Swagger UI не показывает вещи (свойства) элемента 2,и показывает все вещи элемента 3 (должно быть oneOf).
"responses": {
"200": {
"description": "Operation successfully executed.",
"content": {
"application/json": {
"schema": {
"properties": {
"user_id": {
"$ref": "#/components/schemas/user_id"
},
"results": {
"type": "array",
"items": {
"$ref": "#/components/schemas/result_user_by_id"
}
}
},
"type": "object",
"allOf": [
{
"$ref": "#/components/schemas/core_response_schema"
}
],
"oneOf": [
{
"$ref": "#/components/schemas/user_type_a"
},
{
"$ref": "#/components/schemas/user_type_b"
},
{
"$ref": "#/components/schemas/user_type_c"
}
]
}
}
}
}
},
"components": {
"schemas": {
"core_response_schema": {
"properties": {
"success": {
"description": "A flag indicating whether the request was successfully completed or not.",
"type": "boolean"
},
"num_results": {
"description": "The number of results for this request",
"type": "integer"
}
},
"type": "object"
},
"user_id": {
"description": "Unique 10 character `user_id`.",
"type": "string",
"maxLength": 10,
"minLength": 10,
"example": "a1b2c3d4e5"
},
}
}
И пример полезной нагрузки для двух пользователей.Введите A и B (это надуманный пример).
Пользовательский тип A:
{
"success": true,
"num_results": 1,
"user_id": "c1b00cb714",
"results": [{
"user_type": "a",
"group_id": "e7a99e3769",
"name": null,
"title": null,
... (and so on until we get to the stuff that's unique to this type of user) ...
"favourite_artworks": [
"sunflowers",
"landscapes"
],
"artwork_urls": [
"http://sunflowers.example"
]
}
]
}
Пользовательский тип B:
{
"success": true,
"num_results": 1,
"user_id": "c1b00cb715",
"results": [{
"user_type": "B",
"group_id": "e7a99e3769",
"name": null,
"title": null,
... (and so on until we get to the stuff that's unique to this type of user) ...
"supported_charities": [
"UN Foundations"
],
"charity_urls": [
"http://www.un.int"
],
}
]
}
Какой правильный способ объединенияразные схемы и свойства в OpenAPI?Правильно ли это, и Swagger UI просто не может с этим справиться?
И как вы смешиваете схему со свойствами, не используя allOf
?
Это говорит о том, что это возможно: Схема Swagger: oneOf, anyOf, allOf действительны одновременно?