使用 Swagger/OpenAPI 创建可扩展模型

2023-12-15

在我的 API 中,我希望为我的集合提供一个简单的模型,为我的个人资源提供一个更复杂的模型。例如:

一个 GET 请求/libraries应该返回

BaseLibrary:
    type: object
    properties:
        library_id:
          type: string
          description: The id of the library
        display_name:
          type: string
          description: Name of the library
        href:
          type: string
          description: The URI linking to this library.

而对特定库的请求应返回上述所有内容,包括额外的参数 books:

所以一个 GET 请求libraries/{library_id}应该返回:

ExtendedLibrary:
    type: object
    properties:
        library_id:
          type: string
          description: The id of the library
        display_name:
          type: string
          description: Name of the library
        href:
          type: string
          description: The URI linking to this library.
        books:
          type: array
          description: The books in this library
          items:
            $ref: "#/definitions/books"

我非常希望不必两次定义“BaseLibrary”,并且希望简单地建模一个附加的“ExtendedLibrary”,其中包含基础库和附加书籍属性的所有响应。

我尝试了很多不同的事情,最接近成功的是以下定义:

definitions:
  BaseLibrary:
    type: object
    properties:
        library_id:
          type: string
          description: The id of the library.
        display_name:
          type: string
          description: Name of the library
        href:
          type: string
          description: The URI linking to this library.

  ExtendedLibrary:
    type: object
    properties:
      $ref: "#/definitions/BaseLibrary/properties"
      books:
        type: array
        description: The available books for this library.
        items:
          $ref: "#/definitions/Book"

然而,这给了我一个“额外的 JSON 参考属性将被忽略:书籍”警告,并且输出似乎忽略了这个额外的属性。有一个干净的方法来处理我的问题吗?或者我是否只需将整个 BaseLibrary 模型复制粘贴到我的 ExtendedLibrary 模型中?


正如评论部分提到的,这可能是重复的另一个问题,但值得在这个特定示例的上下文中重复答案。解决方案是使用allOf定义中的属性ExtendedLibrary:

definitions:
  Book:
    type: object
    properties:
      title:
        type: string
      author:
        type: string

  BaseLibrary:
    type: object
    properties:
      library_id:
        type: string
        description: The id of the library
      display_name:
        type: string
        description: Name of the library
      href:
        type: string
        description: The URI linking to this library.

  ExtendedLibrary:
    type: object
    allOf:
      - $ref: '#/definitions/BaseLibrary'
      - properties:
          books:
            type: array
            description: The books in this library
            items:
              $ref: "#/definitions/Book"

根据我的经验,Swagger UI 可以正确地可视化这一点。当我将操作响应定义为ExtendedLibrarySwagger UI 显示了这个示例:

{
  "library_id": "string",
  "display_name": "string",
  "href": "string",
  "books": [
    {
      "title": "string",
      "author": "string"
    }
  ]
}

此外,Swagger Codegen 做了正确的事情。至少在生成 Java 客户端时,它会创建一个ExtendedLibrary正确扩展的类BaseLibrary.

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

使用 Swagger/OpenAPI 创建可扩展模型 的相关文章

随机推荐

  • cx_freeze 之后的 subprocess.Popen 行为

    我有一些 python 代码使用subprocess Popen打开控制台应用程序并从中获取 stdout stderr 从解释器启动工作正常且符合预期 使用 cx freeze 后 base name Win32GUI选项 Popen 现
  • 游标中的动态表名

    我正在尝试插入架构是动态的数据 就像用户输入架构名称一样 由于某种原因我得到ORA 000942 table doesn t exist即使表存在于正确的架构中 这是代码 declare l ext files names varchar2
  • Oracle SQL Developer 导出源以进行版本控制

    我们有包含很多内容的大型数据库 我想使用版本控制 Git 来管理更改 有很多文章如何一步一步地做到这一点 但我缺少一篇 整个数据库 不包括数据 的文件结构是否有标准或推荐的方法以及如何从现有数据库中获取它 它有很多源 程序 函数 包等 版本
  • MATLAB 使用 IF 语句返回向量函数

    我将一个自写函数称为向量的 函数 如下所示 x values 0 1 2 result func x values 问题是在这个函数中我有一个if语句来确定输出 如果我将此函数应用于标量 则没有问题 但如果我将其应用于数字向量 则if声明没
  • 在android中的listview中加载本地xml数据

    您能建议一个在列表视图中加载本地 XML 数据的简单示例吗 首先将您的 XML 文件放入 raw 文件夹中 然后使用下面的代码使用 Dom Parser 解析此 XML 文件 public class XMLParsingDOMExampl
  • R 函数不返回值

    我正在编写我的第一个 R 函数 IMDBmovierating lt function movie link lt paste http www omdbapi com t movie y plot short r json sep jso
  • ViewPager 内的 ScrollView:滑动不起作用

    我有包含三个片段的 ViewPager 其中之一是内部带有 ScrollView 的 FrameLayout
  • .git 文件夹是什么?

    文件夹叫什么 git 它是在存储库中创建的 其中包含什么以及为何创建 git 初始化为git init git 包含版本控制所需的所有信息 如果您想克隆您的存储库 复制 git 就足够了 4个子目录 hooks 示例脚本 info excl
  • 如何使用 R 从 CrossRef 中提取 xml 数据?

    如果您输入 CrossRef 电子邮件 以下 URL 会生成一个 XML 文件 http www crossref org openurl title Science aulast Fern ndez date 2009 multihit
  • 1054, 字段列表中未知列“索引”

    df row head identifier link likes count company 0 2292512316069378197 https www instagram com p B Qo84ihfiV 9608 Ralph L
  • 在 Hibernate 标准结果中排除 bean 的字段

    以下是我如何从数据库获取用户 bean session createCriteria User class list 这将返回数据库中的所有用户记录 有趣的是 我不想从数据库获取密码字段 只是想在检索时排除该字段 我有的选择 1 使用其他领
  • 到底什么是类工厂?

    我经常看到这个词被抛出 随着时间的推移 我自己可能在代码和库中使用过它 但我从未真正理解它 在我遇到的大多数文章中 他们只是继续期待你能弄清楚 什么是类工厂 有人可以解释这个概念吗 以下是一些补充信息 可能有助于更好地理解其他几个较短但技术
  • 项目反应器:collectList()不适用于Flux.create()

    下面的示例打印从 1 到 10 的整数以及 7 8 9 10 的列表 public void streamCollect ConnectableFlux
  • 如何使用 aws 控制台将带有库的 python 代码从 Windows 本地计算机上传到 aws lambda

    我需要使用通过 API 网关触发的 AWS Lambda 我有 python 脚本 它从 S3bucket 加载机器学习模型 并从 api 调用获取输入并预测结果 我可以成功触发用 python 内联编写的 lambda 函数 但我想使用机
  • 使用parallelStream foreach创建HashMap,但有时value为空

    Java 代码如下 List
  • 有安全的浏览器缓存吗?

    注意 这是一个与 https 不同的问题 它与隐私安全有关 我试图弄清楚是否有一种方法可以通过将信息推送到浏览器来减轻服务器 缓存 的负载 是否有任何技术可以提供绑定到会话的安全缓存 我们拥有经常使用的隐私敏感数据 但不会发生太大变化 一直
  • 如何在打开的管理员程序中调用system()并赋予其相同的权限?

    我正在 Windows 中编写一个以管理员身份运行的 C 应用程序 然而 在拨打电话时system 命令 似乎该命令没有管理员权限 无法在C Program Files x86 目录 我怎样才能避免使用创建进程 如果你使用system您可以
  • 如何在 GAE 中使用推送队列(任务)?

    我的 GAE 应用程序应该将多个文件上传到另一台服务器 使用 urlfetch 如何实现这一点tasks假设在最后一项任务完成后我应该再执行一项操作 我如何知道最后一个任务何时完成 Upd 以下任务方法是否正确 class Accumula
  • 在 Woocommerce 中单击后将“添加到购物车”按钮更改为“查看购物车”按钮

    我有一个 WordPress 网站 我正在使用 WooCommerce 的店面主题 我启用了 ajax 添加到购物车按钮 单击 添加到购物车 按钮并且将产品成功添加到购物车时 我希望该按钮更改为 查看购物车 按钮 将文本更改为 查看购物车
  • 使用 Swagger/OpenAPI 创建可扩展模型

    在我的 API 中 我希望为我的集合提供一个简单的模型 为我的个人资源提供一个更复杂的模型 例如 一个 GET 请求 libraries应该返回 BaseLibrary type object properties library id t