昂首阔步;根据可选参数指定具有相同代码的两个响应

Swagger; specify two responses with same code based on optional parameter

这个问题不是 () 的重复问题,因为那个 OP 试图 return 200 或 400。

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

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

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

在 yaml 中,我尝试使用两个 200 代码,但查看器将它们压扁,就好像我只指定了一个。

有办法吗?

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

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

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

/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) 以验证我是否遗漏了更多内容。

我明白这不是明确的 allowed/encouraged 去做(我也没有找到明确禁止这样做的地方)。但作为一种解决方法,并且是在当前规范中记录具有此行为的 API 的唯一方法,看起来像是一个选项。

我发现了两个问题:

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

如果这些不是障碍,它至少可以让您正确记录此类情况并允许使用 swagger 编辑器进行测试。

OpenAPI 2.0

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

OpenAPI 3.x

在 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'

但是,无法将特定的响应模式映射到特定的参数值。您需要在响应的 description 中口头记录这些细节,操作and/or参数。

这是一个可能相关的增强请求:
Allow operationObject overloading with get-^ post-^ etc


Swagger UI 用户注意事项:旧版本的 Swagger UI(v.3.39.0 之前)不会自动为 oneOfanyOf 模式。作为解决方法,您可以手动指定响应 exampleexamples。请注意,使用多个 examples 需要 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:   # <--- Workaround for Swagger UI < 3.39.0
                foo: bar