猿问

昂首阔步的继承与组成

在我的“简化” API中,所有响应均从基本“响应”类派生(继承)。响应类由填充有元数据的头和包含用户所请求的核心数据的主体组成。布置响应(以JSON格式),使得所有元数据都位于第一个“层”上,并且body是这样一个称为“ body”的单个属性


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规范中找到继承的示例(如下所示),但是找到了composition的示例。

我可以肯定的是,这个“判别器”在很大程度上发挥了作用,但不确定我需要做什么。



慕容3067478
浏览 671回答 3
3回答

慕仙森

这里的所有答案都已经很好了,但是我只想对构成与继承作一点说明。根据Swagger / OpenAPI Spec,要实现组合,使用该allOf属性就足够了,正如@oblalex正确指出的那样。然而,为了实现继承,你需要使用allOf与discriminator,如通过@TomaszSętkowski例子。另外,我在API Handyman上找到了更多有关组合和继承的 Swagger示例。它们是Arnaud Lauret 出色的Swagger / OpenAPI教程系列的一部分,我认为每个人都应该签出。
随时随地看视频慕课网APP
我要回答