当前位置: 首页 > 知识库问答 >
问题:

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

邵兴怀
2023-03-14

我有一个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
        }
    }
}

但似乎swagger不喜欢“必需”属性,并将显示以下错误消息:

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

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

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

共有1个答案

鞠鸿雪
2023-03-14

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

正确的形式是:

    "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属性中没有的任何内容都是可选的。请记住,这意味着可以同时获取消息文件名

然后,您可以将此模型用于200响应。

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

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

 类似资料:
  • 问题内容: 做这样的事情的语法是什么: 基本上,我想选择具有属性和属性的元素: 元件如以下应该 没有 被选择: 问题答案: 简单会很好。它实际上在标准文档中有很好的描述: 可以使用多个属性选择器来引用元素的多个属性,甚至可以多次引用同一属性。 在此,选择器匹配所有SPAN元素,这些元素的“ hello”属性的值恰好为“ Cleveland”,而其“再见”属性的值恰好为“ Columbus”: 附带

  • 我也想用昂首阔步做同样的事情。 为了总结以上问题的答案,使用jsonschema,可以这样做: 答案的关键点是使用之一。 注意:一些swagger实现使用(或类似的)来指定属性值可以为null,但是,用对象引用的内容替换对象,因此似乎忽略了对的任何使用。

  • 问题内容: 我想按对象的指定属性对对象列表进行排序,并希望选择用于排序的属性。例: 这个想法很简单: 我将要排序的所有值都放入一个数组中,并创建了一个映射,将这些值映射回它们的对象。对这个数组进行排序后,我将映射到这些值的对象按相同的顺序放入一个新数组中,然后按这些值对它们进行排序。这些值只是使用Object类型创建的,因此我可以按多种类型(不仅仅是示例中的Strings)进行排序。 除非您有两个

  • 我还有这个包含ID列表: 我想筛选以便筛选的不包含id来自的对象,因此我尝试使用stream: 我找不到做这件事的正确函数。有人有什么建议让我试试吗?

  • 我有一个本体,是使用Protegé4.3.0创建的,我将使用OWL-API为指定的个体和对象属性表达式获取对象属性值(即一组对象)。

  • 这个问题不是(Swagger-指定可选对象属性或多个响应)的重复,因为该OP试图返回200或400。 我有一个带有可选参数的;e、 例如,。 我想返回一个200,其模式根据是否传递了参数而不同,例如: 在yaml中,我尝试了两个200码,但是查看器压缩了它们,好像我只指定了一个。 有办法做到这一点吗? 编辑:以下内容似乎相关:https://github.com/OAI/OpenAPI-Speci