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

Swagger;基于可选参数指定两个具有相同代码的响应

松波
2023-03-14

这个问题不是(Swagger-指定可选对象属性或多个响应)的重复,因为该OP试图返回200或400。

我有一个带有可选参数的GET;e、 例如,GET/endpoint?选择器=foo

我想返回一个200,其模式根据是否传递了参数而不同,例如:

GET /endpoint -> {200, schema_1}
GET /endpoint?selector=blah  -> {200, schema_2}

在yaml中,我尝试了两个200码,但是查看器压缩了它们,好像我只指定了一个。

有办法做到这一点吗?

编辑:以下内容似乎相关:https://github.com/OAI/OpenAPI-Specification/issues/270

共有2个答案

戈念
2023-03-14

我想要同样的东西,我想出了一个似乎有效的变通方法:

我刚刚定义了两条不同的路径:

/path:
(...)
      responses:
        200:
          description: Sucesso
          schema:
            $ref: '#/definitions/ResponseOne'
(...)

/path?parameter=value:
(...)
      responses:
        200:
          description: Sucesso
          schema:
            $ref: '#/definitions/ResponseTwo'
(...)

路径在swagger编辑器中起作用。我甚至可以以不同的方式记录每个选项,并将仅在第二种情况下的可选参数放在一起,使API文档更干净。使用operationId可以为生成的API方法生成更干净的名称。

我在这里发布了相同的解决方案(https://github.com/OAI/OpenAPI-Specification/issues/270)以验证我是否遗漏了更多内容。

我确实理解没有明确允许/鼓励它这样做(我也没有发现任何地方明确禁止它)。但作为一种解决方法,并且是在当前规范中记录具有这种行为的API的唯一方法,看起来是一种选择。

我发现了它的两个问题:

  • Java代码gen URL转义"="符号,因此它不会工作,除非您在生成的代码中修复此问题。可能它发生在其他代码生成器。
  • 如果您有更多的查询参数,它将添加一个额外的?而失败;

如果这些不是拦截器,它至少可以让你正确地记录这样的情况,并允许用昂首阔步的编辑器进行测试。

齐弘业
2023-03-14

OAS2不支持每个状态代码有多个响应模式。您只能有一个模式,例如,一个自由形式的对象(type:object,不带properties)。

在OAS3中,您可以使用oneOf为同一操作定义多个可能的请求主体或响应主体:

openapi: 3.0.0
...
paths:
  /path:
    get:
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/ResponseOne'
                  - $ref: '#/components/schemas/ResponseTwo'

但是,不可能将特定的响应模式映射到特定的参数值。您需要在响应、操作和/或参数的说明中口头记录这些细节。

这里可能有一个相关的增强请求:
允许使用get-^post-^etc重载operationObject


对于Swagger UI用户的注意事项:在撰写本文(2018年12月)时,Swagger UI不会自动为oneOfanyOf模式生成示例。您可以关注此问题以获取更新。

作为一种解决方法,您可以手动指定响应示例示例。请注意,使用多个示例需要Swagger UI 3.23.0或Swagger Editor 3.6.31。

      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/ResponseOne'
                  - $ref: '#/components/schemas/ResponseTwo'
              example:   # <--------
                foo: bar

 类似资料:
  • 我有一个API,成功后返回以下响应: 或者在失败时像下面这样: 只有在请求成功时才会指定filename属性,但如果出现错误,则会提供消息。这意味着消息和文件名属性是“可选的”,但结果属性是必需的。 我尝试在定义中定义这个响应对象,如下所示: 但似乎swagger不喜欢“必需”属性,并将显示以下错误消息: 当我看一个来自swagger的例子时,他们有以下布局,其中有两个不同的响应定义,而不是一个。

  • 我正在尝试创建restful API(使用Spring Boot v2.0.0.Release),我希望有一个endpoint,但我希望有两种可能的用途: 首先,这可能吗?其次,有人有代码示例吗? 非常感谢你的帮助

  • 我还将列表一中的和成员的每个哈希代码与列表二中成员的哈希代码进行了比较。而且没有区别。但是如果我比较完整列表的hashcode,就有区别了。我不知道为什么。我很无助。 也许有人能帮我。请提前向我致以最诚挚的问候和感谢。

  • 我改变了切入点的顺序,它总是排在第二位。关于如何解决这个问题有什么想法吗? 更新 一旦我发布了这个问题,我就有了一个想法。我这样更改了切入点: 现在异常消失了,但仍然有一个小问题(我想这个问题更容易解决):因为ArrayList实现了可序列化,所以至少在我使用ArrayList的测试用例中,两个切入点都被执行了。 我将对此进行研究,并发布我的发现,但也感谢您的帮助;) 我将代码改为只使用一个切入点

  • 我在SwaggerHub注册,并使用OpenAPI3.0创建了一个新的API。在我的API中,路径有2个非必需参数,但我不能将它们设置为not required--编辑器显示“not alleving values”错误。 以下是我的API定义: 但是,如果删除属性,则会出现2个错误: 什么是有效的语法?

  • 问题内容: Hashcode()和equals()的概念是 1)如果两个对象根据equal()相等,则在这两个对象中的每一个上调用hashcode方法应产生相同的哈希码。 另一个是 2)如果两个对象根据equal()不相等,则不需要在两个对象中的每一个上调用hashcode方法必须产生不同的值。 我尝试并理解了第一个,这是第一点的代码。 上面的程序为两个不同的对象提供了相同的哈希码。 有人可以用一