构建 OpenAPI 响应,包括 oneOf 或 allOf

2024-01-01

我正在尝试使用 OpenAPI 3 从各种架构组件构建响应。响应基本上分为三个部分:

  1. 其他端点使用的共享组件(即成功/失败标志)。 -#/components/schemas/core_response_schema inside allOf.
  2. 属性all对此端点的响应使用(即user_id) - the properties以下的组成部分。
  3. 根据用户类型而变化的几种模式之一。 - 这oneOf成分。

我决定我必须使用allOf能够混合属性(第 2 项)和核心响应(第 1 项),尽管这感觉不对,因为只有一项。我尝试了一个$ref,但没有成功。

下面成功地通过了三个不同的 OpenAPI linting 工具,但在它构建的示例中,Swagger UI 没有显示第 2 项内容(属性),并且does显示第 3 项的所有内容(应该是 oneOf)。

"responses": {
    "200": {
        "description": "Operation successfully executed.",
        "content": {
            "application/json": {
                "schema": {
                    "properties": {
                        "user_id": {
                            "$ref": "#/components/schemas/user_id"
                        },
                        "results": {
                            "type": "array",
                            "items": {
                                "$ref": "#/components/schemas/result_user_by_id"
                            }
                        }
                    },
                    "type": "object",
                    "allOf": [
                        {
                            "$ref": "#/components/schemas/core_response_schema"
                        }
                    ],
                    "oneOf": [
                        {
                            "$ref": "#/components/schemas/user_type_a"
                        },
                        {
                            "$ref": "#/components/schemas/user_type_b"
                        },
                        {
                            "$ref": "#/components/schemas/user_type_c"
                        }
                    ]
                }
            }
        }
    }
},
"components": {
    "schemas": {
        "core_response_schema": {
            "properties": {
                "success": {
                    "description": "A flag indicating whether the request was successfully completed or not.",
                    "type": "boolean"
                },
                "num_results": {
                    "description": "The number of results for this request",
                    "type": "integer"
                }
            },
            "type": "object"
        },
        "user_id": {
            "description": "Unique 10 character `user_id`.",
            "type": "string",
            "maxLength": 10,
            "minLength": 10,
            "example": "a1b2c3d4e5"
        },
    }
}

以及两个用户的示例有效负载。类型 A 和 B(这是一个人为的示例)。

用户类型A:

{
    "success": true,
    "num_results": 1,
    "user_id": "c1b00cb714",
    "results": [{
            "user_type": "a",
            "group_id": "e7a99e3769",
            "name": null,
            "title": null,
            ... (and so on until we get to the stuff that's unique to this type of user) ...
            "favourite_artworks": [
                "sunflowers",
                "landscapes"
            ],
            "artwork_urls": [
                "http://sunflowers.example"
            ]
        }
    ]
}

用户类型B:

{
    "success": true,
    "num_results": 1,
    "user_id": "c1b00cb715",
    "results": [{
            "user_type": "B",
            "group_id": "e7a99e3769",
            "name": null,
            "title": null,
            ... (and so on until we get to the stuff that's unique to this type of user) ...
            "supported_charities": [
                "UN Foundations"
            ],
            "charity_urls": [
                "http://www.un.int"
            ],
        }
    ]
}

在 OpenAPI 中合并不同架构和属性的正确方法是什么?这是对的吗,Swagger UI 就无法处理它吗?

以及如何将架构与属性混合在一起而无需使用allOf?

这表明这是可能的:Swagger Schema:oneOf、anyOf、allOf 同时有效? https://stackoverflow.com/questions/49604468/swagger-schema-oneof-anyof-allof-valid-at-the-same-time


经过进一步调查,我确定这是 swagger-ui 中的一个错误 -https://github.com/swagger-api/swagger-ui/issues/3803 https://github.com/swagger-api/swagger-ui/issues/3803- 他们根本不支持oneOf (or anyOf) 现在。

就至少三种不同的 linting 工具而言,混合了anyOf, oneOf, and allOf可以在同一模式中一起使用。

Redoc 似乎也有类似的问题 -https://github.com/Rebilly/ReDoc/issues/641 https://github.com/Rebilly/ReDoc/issues/641

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

构建 OpenAPI 响应,包括 oneOf 或 allOf 的相关文章

随机推荐

  • 如何在Delphi中定义版本“及以上”ifdefs?

    我正在努力让 Log4D 在 Delphi XE4 中工作 并且遇到一些编译错误 因为它在 use 子句中找不到 Contnrs 除非我将它移到它定义的 ifdef 之外 IFDEF DELPHI5 UP Contnrs ENDIF 经过一
  • 将轮询 Web 服务转换为 RX

    Given public partial class Weather private readonly DispatcherTimer timer new DispatcherTimer private readonly IWeatherD
  • Django 模板内联 jQuery 不起作用

    尝试在我的模板中使用内联 jQuery 以便稍后可以在 AJAX 调用中使用 django url 标签 但我无法让 javascript 工作 在我的子页面中 我扩展了索引页面 其中包含我所有的 javascript 和 jQuery 库
  • 限制减法结果的下限

    我想从标量中减去向量中的值 但是 如果结果小于零 我想将结果设置为零 我尝试过使用max 但它没有给我预期的结果 s 1 750 0 975 0 1125 0 1237 5 1312 5 1400 0 max 1050 s 0 1 300
  • 如何使用apache Camel从mysql表中读取数据并写入到另一个表中

    伙计们 我正在使用 Apache Camel 从 mysql 表读取数据 我在控制台上成功打印它 但根据我的要求 我需要从一个mysql数据库读取数据 然后使用某种条件过滤它 然后将过滤后的数据插入到另一个mysql数据库表中 我在下面发布
  • 如何在Rails中检索图像的EXIF信息

    我正在使用 Rails 回形针在我的页面中显示图像 我想知道如何检索图像的 EXIF 信息 如尺寸 相机型号 高度 宽度等 有人可以帮我吗 谢谢 你给了吗exifr https github com remvee exifr 宝石尝试一下吗
  • 如何在 Java 中覆盖 HTTP 连接中的 DNS

    Curl 具有手动指定将主机解析到哪个 IP 的功能 例如 curl https google com resolve google com 443 173 194 72 113 这在使用 HTTPS 时特别有用 如果只是一个 HTTP 请
  • 在 Scala 工作表中使用自定义枚举时收到错误:java.lang.ExceptionInInitializerError

    UPDATE 2014年9月17日 事实证明 即使先前更新 从 2013 年 2 月 19 日起 中的解决方案无法工作如果一个地方println Value Player2 作为第一个命令 即序数仍然分配不正确 从那以后我创建了一个可验证的
  • Google Play 分阶段推出并修改了屏幕截图

    使用 Google Play 分阶段推出选项 我可以向一小部分用户发布 Android 应用的新版本 根据它的成功程度 我会在给定时间内增加百分比 我假设 因为我找不到记录 如果我将应用程序推广到 10 那么该应用程序的新用户和现有用户都会
  • 使用 nil 合并运算符缩短编译时间

    读完后article https habrahabr ru post 283106 关于快速编译时间 我感兴趣的是为什么使用超过 2 个序列合并运算符会显着增加编译时间 例子 编译时间 3 65 秒 func fn gt Int let a
  • 如何创建自定义 Symfony2 Twig 表单模板块

    我正在开发一个项目 我需要一些自定义表单模板块 不是现有块的修改版本 而是新块 我已经能够创建新的块并让 Symfony Twig 识别和使用它们 但有限制 表单模板块似乎有严格的命名约定 看来模板名称必须恰好包含一个下划线 下划线之前的单
  • Python tkinter 列表框绑定 仅在第二次单击时有效

    如果有其他讨论已经解决了这个问题 我预先表示歉意 但我找不到任何东西 我是 Python 新手 除了 90 年代的一点点 Pascal 之外 我也是编程新手 我正在构建一个带有 tk 输入框的 GUI 供用户输入值 然后将其存储在 sqli
  • Android RecyclerView - 多个Edittext同时更改

    我有一个RecyclerView有很多张牌可以容纳 4EditText 当我在其中输入值时EditText一张卡的值会在随机卡中填充相同的值 令人惊讶的是它不会跳EditText例如 如果我输入值edittext1 of card1它会将相
  • 如何在 Android RecyclerView 上对字符串进行排序?

    我有一个充满 CardView 的 recyclerView 它有 2 个参数 它们都是字符串 其中之一是标题 我想要一个按钮来根据标题按字母顺序对它们进行排序 因为它没有太多元素 所以我决定使用插入排序 即 o n 2 这是我的实现 pu
  • Spring Boot中处理嵌入式Tomcat异常

    我们遇到嵌入式 Tomcat 抛出的问题IllegalArgumentException来自LegacyCookieProcessor 它抛出 500 HTTP 响应代码 我们需要处理异常并对其执行某些操作 具体来说 将其作为 400 发送
  • Android中TextView的TextAppearance属性

    我正在开发我正在使用的 Android 应用程序TextView在屏幕上显示文本 我将此属性用于TextView设置文本的大小android textAppearance android attr textAppearanceMedium
  • 使用 Cognito 令牌访问 S3 时收到“AccessDenied”

    我正在尝试在存储桶上使用 listObjects 操作 这是通过 WebService 访问的 我不想授予用户控制台访问权限 角色政策 Version 2012 10 17 Statement Effect Allow Action mob
  • U2Net模型在android中的使用

    我按照以下步骤将原始 u2net 模型权重文件 u2net pth 转换为tensorflow lite说明 https qiita com PINTO items ed06e03eb5c007c2e102 就转换成功了 但是我在tenso
  • 了解分段错误的堆栈跟踪

    我正在做一个snprintf并出现段错误 当我像这样在 gdb 上加载核心文件时 gdb my executable core 并做了bt为了获得回溯 我得到了以下内容 Program terminated with signal 11 S
  • 构建 OpenAPI 响应,包括 oneOf 或 allOf

    我正在尝试使用 OpenAPI 3 从各种架构组件构建响应 响应基本上分为三个部分 其他端点使用的共享组件 即成功 失败标志 components schemas core response schema inside allOf 属性al