如何在 OpenAPI (Swagger) 中为相同的 HTTP 状态代码定义不同的响应?

Posted

技术标签:

【中文标题】如何在 OpenAPI (Swagger) 中为相同的 HTTP 状态代码定义不同的响应?【英文标题】:How to define different responses for same HTTP status code in OpenAPI (Swagger)? 【发布时间】:2018-05-06 22:36:03 【问题描述】:

我正在为现有 API 编写 OpenAPI 规范。此 API 返回成功和失败的状态 200,但响应结构不同。

例如,在注册 API 中,如果用户注册成功,API 会发送带有以下 JSON 的状态 200:


    "result": true,
    "token": RANDOM_STRING

如果有重复的用户,API 也会发送状态 200,但使用以下 JSON:


    "result": false,
    "errorCode": "00002", // this code is duplicated error
    "errorMsg": "duplicated account already exist"

在这种情况下,如何定义响应?

【问题讨论】:

有什么具体原因您不针对不同的响应使用不同的响应代码? 我正在为已经存在的 api 构建文档。我无法编辑 api,因为有很多 api,现在应用程序使用了 api。 How to specify multiple 404 causes in swagger?的可能重复 【参考方案1】:

这在 OpenAPI 3.0 中是可能的,但在 2.0 中是不可能的。

OpenAPI 3.0 支持 oneOf 为响应指定备用架构。您还可以添加多个响应examples,例如成功和失败的响应。 Swagger UI 自 v. 3.23.0 起支持多个 examples

openapi: 3.0.0
...

paths:
  /something:
    get:
      responses:
        '200':
          description: Result
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/ApiResultOk'
                  - $ref: '#/components/schemas/ApiResultError'
              examples:
                success:
                  summary: Example of a successful response
                  value:
                    result: true
                    token: abcde12345
                error:
                  summary: Example of an error response
                  value:
                    result: false
                    errorCode: "00002"
                    errorMsg: "duplicated account already exist"

components:
  schemas:
    ApiResultOk:
      type: object
      properties:
        result:
          type: boolean
          enum: [true]
        token:
          type: string
      required:
        - result
        - token
    ApiResultError:
      type: object
      properties:
        result:
          type: boolean
          enum: [false]
        errorCode:
          type: string
          example: "00002"
        errorMsg:
          type: string
          example: "duplicated account already exist"

在 OpenAPI/Swagger 2.0 中,每个响应代码只能使用一个模式,因此您最多可以将可变字段定义为可选字段,并在模型 description 或操作 description 中记录它们的用法。

swagger: "2.0"
...

definitions:
  ApiResult:
    type: object
    properties:
      result:
        type: boolean
      token:
        type: string
      errorCode:
        type: string
      errorMsg:
        type: string
    required:
      - result

【讨论】:

这没有在 swaggerhub 和其他 swagger 文件渲染器中正确渲染。它没有在声明的特定响应代码中引用正确的模式。它只是显示一个空白响应,而不使用声明的架构, @iamjoshua 目前 Swagger UI does not 为 oneOfanyOf 模型生成示例,但您可以通过提供自定义 exampleexamples 来解决此问题 - 如我的回答.如果其他渲染器工具存在问题,请考虑向工具供应商提交错误报告。

以上是关于如何在 OpenAPI (Swagger) 中为相同的 HTTP 状态代码定义不同的响应?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Gradle 中为 OpenAPI 3.0 使用 Swagger Codegen?

如何在 Swagger 3.0 中为组件编写嵌套对象

在 springdoc-openapi-ui 中为基本身份验证启用授权按钮

如何在 OpenAPI (Swagger) 中定义枚举?

如何使用 Swagger\OpenAPI 记录 GraphQL?

如何在 Swagger (OpenAPI) 中发布文件?