多响应正文示例取决于 OpenApi 3.0.0/Swagger 中的媒体类型

Posted

技术标签:

【中文标题】多响应正文示例取决于 OpenApi 3.0.0/Swagger 中的媒体类型【英文标题】:Multiple Response Body Examples depending on media type in OpenApi 3.0.0/Swagger 【发布时间】:2020-03-26 16:14:00 【问题描述】:

我正在尝试记录接受多个 mime 类型请求并根据类型返回不同响应的端点的响应。一种响应类型 pdf 会返回自己的模式,与其他模式分开。其余的都返回相同的模式和相同的示例。此语法有效。几乎。除了在 UI 示例中,JSON 响应还显示字符串“$ref:example-two.json”以及相应的响应示例。喜欢:


  "key": "value",
  "key2": "value2",
  "$$ref: example-two.json"

什么时候应该是:


  "key": "value",
  "key2": "value2"

我一直在搜索文档、堆栈和谷歌,但我没有看到任何使这样的东西工作的例子。或者更确切地说,我不明白为什么这个不起作用,但我没有看到任何包含每个示例的 $refs 的示例。

responses:
    200:
        content:
            application/pdf:
                schema:
                    $ref: ../app.yaml#/components/schemas/ModelOne
            application/json:
                schema:
                    $ref: ../app.yaml#/components/schemas/ModelTwo
                examples:
                    Example:
                        value:
                            $ref: example-two.json
            text/html:
                schema:
                    $ref: ../app.yaml#/components/schemas/ModelTwo
                examples:
                    Example:
                        value:
                            $ref: example-two.json

对于上下文 - 我无法更改端点行为,并且我确实需要为每种 mime 类型展示一个示例,即使它们是相同的。因为一个不同。先感谢您!

【问题讨论】:

【参考方案1】:

在 OpenAPI 3.0 中有两种方法可以$ref 一个示例:

1) 在components/examples 部分定义示例。在这种情况下,$refexamples.<name> 键内使用(不在 value 内)。

                examples:
                    Example:
                        $ref: '#/components/examples/MyExample'
                ...

components:
  examples:
    MyExample:
      summary: Optional short description of this example
      value:
        key: value
        key2: value2

2) 如果example-two.json 文件仅包含示例值(在本例中为示例 JSON),您可以使用 externalValue 链接到该文件:

                examples:
                    Example:
                        externalValue: example-two.json

注意事项:

externalValue 中的相对 URL 根据 API 服务器 URL (servers[*].url) 而不是 OpenAPI 定义文件的位置进行解析。您可能需要使用绝对 URL。

目前(截至 2019 年 12 月)未在 Swagger UI 中显示带有 externalValue 的示例 - 请参阅 issue #5433。

【讨论】:

感谢您的回复!当我在没有值的情况下尝试它时:在您的第一个示例示例之后的键,不幸的是,什么都没有显示。我无法使用第二个示例,因为我需要它在 UI 中显示。 您使用什么版本的 Swagger UI?打开浏览器开发工具 > 控制台选项卡并评估 versions 您是按原样使用我的第一个示例,还是尝试$ref 那里的外部文件?如果是后者,外部文件的内容是什么? 是的,我不得不尝试 $ref,$ref 是具有预期 json 输出的本地 json 文件。我在 Swagger UI "version":"3.23.6" "$ref 是一个本地 json 文件,具有预期的 json 输出。" 这就是问题所在。外部 JSON 文件的格式必须为 OAS3 Example Object,即"summary": "Optional short description of this example", "value": "key": "value", "key2": "value2"

以上是关于多响应正文示例取决于 OpenApi 3.0.0/Swagger 中的媒体类型的主要内容,如果未能解决你的问题,请参考以下文章

Swagger 2与OpenAPI 3

如何在OpenAPI 3.0中用两个可选参数定义路径?

gcp api 网关在调用 x-google-backend 之前是不是根据 OpenAPI 规范验证请求正文?

“内容”是啥意思:在招摇/openapi“响应”中是啥意思:

Helidon MP OpenAPI不会生成更新的openapi端点响应

如何为内容类型的响应正文提供示例值:Swagger 中的 text/html(使用 dredd 进行测试)