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».

Ответы на вопрос(4)

Ваш ответ на вопрос