Swagger Наследование и состав
В моем «упрощенном» 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)
Я попытался определить это отношение в swagger с помощью следующего 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», которые были созданы (составлением) с использованием любой комбинации объектов response_header и response_body. Объекты response_header и response_body могут быть расширены и вставлены в любой объект ответа, что делается в случае filename_response, который использует дочерний файл filename_response_body базового класса response_body. Как с ошибочными, так и с успешными ответами используется объект «response».