Swagger - 指定可选对象属性或多个响应

时间:2015-01-08 15:51:29

标签: swagger

我有一个API可以在成功时返回以下响应:

{
    "result": "success",
    "filename": "my-filename.txt"
}
失败时

或类似的事情:

{
    "result": "error",
    "message": "You must specify the xxx parameter."
}

仅在请求成功时才指定filename属性,但如果出现错误则提供消息。这意味着消息和文件名属性是"可选"但结果属性是必需的。

我尝试在定义中定义此响应对象,如下所示:

"my_response_object": {
    "type": "object",
    "properties": {
        "result": {
            "type": "string",
            "description": "value of 'success' or 'error', indicated whether was successful",
            "required": true
        },
        "message": {
            "type": "string",
            "description": "an error message if there was an issue",
            "required": false
        },
        "filename": {
            "type": "string",
            "description": "the filename to return if the request was successful",
            "required": false
        }
    }
}

但似乎招摇不喜欢"必需"属性并将显示以下错误消息:

enter image description here

当我从swagger看一个例子时,他们有以下布局,其中有两个不同的响应定义而不是一个。

"responses": {
    "200": {
        "description": "Profile information for a user",
        "schema": {
            "$ref": "#/definitions/Profile"
        }
    },
    "default": {
        "description": "Unexpected error",
        "schema": {
            "$ref": "#/definitions/Error"
        }
    }
}

我可以这样做,但似乎不能有200个错误代码的多个响应。这是否意味着必须使用"默认"对于所有错误响应,一个只能有一个结构用于所有错误响应,或者有没有办法指定某些属性在定义中是可选的?

1 个答案:

答案 0 :(得分:43)

您在模型中收到错误,因为这不是定义所需属性的方法。

正确的形式是:

    "my_response_object": {
        "type": "object",
        "required": [ "result" ],
        "properties": {
            "result": {
                "type": "string",
                "description": "value of 'success' or 'error', indicated whether was successful"
            },
            "message": {
                "type": "string",
                "description": "an error message if there was an issue"
            },
            "filename": {
                "type": "string",
                "description": "the filename to return if the request was successful"
            }
        }
    }

任何不在required属性中的内容都被认为是可选的。请注意,这意味着可以 messagefilename

然后,您可以使用此模型进行200响应。

然而 - 当谈到REST API设计时,这打破了一个更常见的标准。从HTTP协议获取的状态代码旨在传达操作的结果。 2XX用于成功响应,4XX用于因用户输入错误而导致的错误,5XX用于服务器端的问题(3XX用于重定向)。你在这里做的是告诉客户 - 操作是成功的,但事实上,这可能是一个错误。

如果您仍然可以修改API,我强烈建议使用状态代码进行区分,即使使用精细调整的区别,例如200用于成功的GET操作,201用于成功的POST(或创建)操作,等等根据此处的定义 - http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html