У моєму "спрощеному" API всі відповіді виводяться ( успадковуються ) з базового класу "відповіді". Клас відповіді складається із заголовка, заповненого метаданими, та тіла, що містить основні дані, які користувач запитує. Відповідь (у форматі JSON) викладена таким чином, що всі метадані знаходяться на першому "шарі", а тіло є єдиним атрибутом, що називається "тіло" як таке
response
|--metadata attribute 1 (string/int/object)
|--metadata attribute 2 (string/int/object)
|--body (object)
|--body attribute 1 (string/int/object)
|--body attribute 2 (string/int/object)
Я спробував визначити це співвідношення у хитрому з наступним JSON:
{
...
"definitions": {
"response": {
"allOf": [
{
"$ref": "#/definitions/response_header"
},
{
"properties": {
"body": {
"description": "The body of the response (not metadata)",
"schema": {
"$ref": "#/definitions/response_body"
}
}
}
}
]
},
"response_header": {
"type": "object",
"required": [
"result"
],
"properties": {
"result": {
"type": "string",
"description": "value of 'success', for a successful response, or 'error' if there is an error",
"enum": [
"error",
"success"
]
},
"message": {
"type": "string",
"description": "A suitable error message if something went wrong."
}
}
},
"response_body": {
"type": "object"
}
}
}
Потім я намагаюся створити різні відповіді, створюючи різні класи body / header, які успадковуються від body / header, а потім створюю дочірні класи відповідей, які складаються з відповідних класів header / body (показано у вихідному коді внизу). Однак я впевнений, що або це неправильний спосіб робити щось, або що моє впровадження неправильне. Я не зміг знайти приклад успадкування в специфікації swagger 2.0 (показано нижче), але знайшов приклад композиції .
Я майже впевнений, що цей "дискримінатор" повинен зіграти велику роль, але не впевнений, що мені потрібно робити.
Питання
Хтось може показати мені, як передбачається реалізувати композицію + успадкування в swagger 2.0 (JSON), бажано, "виправивши" мій приклад коду нижче. Також було б чудово, якби я міг вказати клас ErrorResponse, який успадковується від відповіді, де атрибуту "result" у заголовку завжди встановлено значення "error".
{
"swagger": "2.0",
"info": {
"title": "Test API",
"description": "Request data from the system.",
"version": "1.0.0"
},
"host": "xxx.xxx.com",
"schemes": [
"https"
],
"basePath": "/",
"produces": [
"application/json"
],
"paths": {
"/request_filename": {
"post": {
"summary": "Request Filename",
"description": "Generates an appropriate filename for a given data request.",
"responses": {
"200": {
"description": "A JSON response with the generated filename",
"schema": {
"$ref": "#/definitions/filename_response"
}
}
}
}
}
},
"definitions": {
"response": {
"allOf": [
{
"$ref": "#/definitions/response_header"
},
{
"properties": {
"body": {
"description": "The body of the response (not metadata)",
"schema": {
"$ref": "#/definitions/response_body"
}
}
}
}
]
},
"response_header": {
"type": "object",
"required": [
"result"
],
"properties": {
"result": {
"type": "string",
"description": "value of 'success', for a successful response, or 'error' if there is an error",
"enum": [
"error",
"success"
]
},
"message": {
"type": "string",
"description": "A suitable error message if something went wrong."
}
}
},
"response_body": {
"type": "object"
},
"filename_response": {
"extends": "response",
"allOf": [
{
"$ref": "#definitions/response_header"
},
{
"properties": {
"body": {
"schema": {
"$ref": "#definitions/filename_response_body"
}
}
}
}
]
},
"filename_response_body": {
"extends": "#/definitions/response_body",
"properties": {
"filename": {
"type": "string",
"description": "The automatically generated filename"
}
}
}
}
}
Оновлення схеми
Щоб спробувати пояснити, що я хочу, я створив дуже базову діаграму нижче, яка має на меті показати, що всі відповіді є екземплярами об'єкта "відповідь", який був побудований (композицією) за допомогою будь-якої комбінації об'єктів response_header і response_body. Об'єкти response_header і response_body можуть бути розширені та вставлені в будь-який об'єкт відповіді, що робиться у випадку з ім'ям файлу_відповідь, який використовує дочірнє ім'я файлу_відповідь_тіла базового класу response_body. Як помилки, так і успішні відповіді використовують об'єкт "відповідь".