如何从 Swagger API 声明生成 JSON-Schema

2024-03-19

我有 Swagger API 声明,用于使用招摇 v 1.2 https://github.com/wordnik/swagger-spec/blob/master/versions/1.2.md.

我对 Swagger 的最初感觉是它非常接近 JSON Schema(Draft 3 和最近的 Draft 4),并且为请求和响应对象生成 JSON Schema 应该相对容易。

然而,虽然 Swagger 部分重用了 JSON Schema 结构,但事实证明它只使用了功能的子集,并且还在 Models 中引入了自己的继承(使用subTypes and discriminator).

问题:是否有任何现有的项目或代码可以从 Swagger API 声明生成可用的 JSON 模式?

最好是 JSON Schema Draft 4 并使用 Python(但我很乐意找到任何东西)。


在与使用 Swagger 指定 REST API 并在相关测试套件中重用它进行了长时间的斗争之后,我将分享我自己的经验(回答我自己的问题)。

Swagger 仅支持 JSON Schema Draft 4 的子集

Swagger 1.2 和 2.0 规范指出,它仅支持 JSON Schema Draft 4 的子集(第 4 章)。here https://github.com/OAI/OpenAPI-Specification/issues/156#issuecomment-59009462)。这意味着:

  • 我们不能相信每个有效的 JSON Schema 都能被 Swagger 完全支持。
  • 考虑到 XML,Swagger 仅支持 JSON Schema Draft 4 提供的 JSON 结构子集的规范表示。

换句话说:

  • Swagger(1.2 和 2.0)不支持使用许多 JSON 结构,这些结构在 JSON Schema Draft 4 中有效(这同样适用于 Draft 3)。
  • Swagger 不支持一般的 XML 数据结构,只允许非常有限的结构。

在实践中,您不能从使用 JSON 或 XML 设计数据开始,而使用 Swagger 则必须以 Swagger 开始和结束。

获取 JSON Schema 理论上是可能的,但并不容易

我花了一些时间编写一个库,该库将采用 Swagger API 规范并创建 JSON Schema Draft 4。我放弃的原因有几个:

  • 这一点都不容易
  • 失望地发现,我只能使用 JSON Schema 提供的子集。我们已经提出了一些 JSON 有效负载,并且必须开始修改它以适应 Swagger 规范框架允许的内容。

除了用于显示和测试 API 的 UI 非常漂亮之外(是的,每个人都同意,它在视觉上非常令人愉悦),我发现很奇怪,规范框架不允许我们使用我们想要的东西,而是添加了意想不到的限制到我们的设计。

如果您想要完整的 JSON 或 XML 架构支持,请使用 RAML

研究其他API规范框架,我发现了RAML。由于它是通过支持任何 JSON Schema Draft 3/4 或 W3C XML Schema 1.0 数据结构从头开始构建的,因此体验非常好 - 设计了有效负载的结构后,我能够非常快速地编写 API 规范并跟踪真实请求的验证针对已定义模式的响应非常容易,因为模式是规范的基本组成部分,无需对其添加任何限制。

当时 RAML 是 0.8 版本(1.0 版本尚未发布)。

纠正问题才能得到真正的解决方案

好的问题就解决了一半。我的问题是错误的,因为它未能满足我的真实期望。更正的问题是:

使用什么规范框架和技术来指定使用由任意 JSON Schema Draft 4 或 W3C XML Schema 1.0 定义的有效负载的 REST API。

我对这样的问题的回答是:

  1. 在 JSON Schema Draft 4 或 W3C XML Schema 中设计您的负载
  2. 通过 RAML(目前为 v0.8)描述您的 REST API。

可能还有其他可用的规范框架,但 Swagger(无论是 v1.2 还是 v2.0)绝对不是这样。除了提供很多功能(代码生成、非常漂亮的 API 文档等等)之外,它根本无法为上述更新的问题提供解决方案。

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

如何从 Swagger API 声明生成 JSON-Schema 的相关文章

随机推荐

  • Flask RESTful POST JSON 失败

    我在通过 curl 从 cmd Windows 7 将 JSON 发布到 Flask RESTful 时遇到问题 这就是我发布的内容 curl exe i H Content Type application json H Accept a
  • Postgres 执行函数(如果存在)

    是否可以编写一个选择语句来执行函数 如果存在 SELECT COALESCE CASE WHEN EXISTS SELECT FROM pg proc WHERE proname func name THEN null ELSE false
  • 在 MySQL 中对同一个表使用子查询

    我有一张桌子叫Staff它有以下字段 idStaff Name Phone Email SupervisorId The SuervisorId is the idStaff该工作人员的主管 我想显示所有员工的列表及其基本信息 姓名 电子邮
  • Elasticsearch 一个月内特定小时的总价值

    我有一个带有字段的elasticsearch服务器 timestamp user and bytes down 除其他外 我想计算用户一个月内的 bytes down 值总计 但仅限于上午 8 点到晚上 8 点之间的时间 我可以通过以下查询
  • 如何自动加载键盘(iOS SDK)?

    非常简单的问题 我得到一个由两个文本字段组成的视图 当视图加载时 我希望键盘自动弹出并聚焦第一个字段 我怎么做 在代码中 在 IB 中 多谢 芥末 In your viewDidAppear 方法调用 yourTextField becom
  • 使用相同表单名称进行 Jquery 验证[重复]

    这个问题在这里已经有答案了 我有一个表格可以做两件事 将名字和电子邮件地址传递给 PHP 如果用户想要提交多于一组或两组数据 则单击即可动态添加一组新的姓名 电子邮件字段 由于我不确切知道每个用户可能选择提交多少组 因此我将数据以数组形式传
  • 给出分割错误的 2D 矢量

    我正在尝试使用向量创建一个二维数组 我编写了以下代码 int main vector lt vector
  • 无法在 Sitecore 项目上设置工作流程和工作流程状态属性

    我目前正在开发一个项目 需要我设置一个非常简单的 Sitecore 工作流程 在修改现有项目以使用新工作流程时 我遇到了一些困难 这就是我所做的 当内容管理员开始编辑项目时 工作流程会创建一个新版本 并在单击提交按钮时发布该项目 我将这些工
  • 如何(策略)以 BDD 风格对属性(获取/设置)进行单元测试?

    我有一个 很多 类具有属性 有些有逻辑 有些则没有 假设我想测试这些属性 我该怎么做呢 最近 我对用于创建单元测试的 BDD 风格很感兴趣 see here http iridescence no post Extending xUnit
  • ASP.NET 身份 cookie 和子域

    我正在尝试跨子域共享我的 ASP NET Identity cookie 目前只是本地 sub1 domain local 子2 域 本地 我有相同的机器密钥在两个站点上 但在 sub1 上创建的 cookie 不会在 sub2 上验证 反
  • 如何让StatusBar透明?

    有谁知道如何使用 React Native 使 Android 状态栏透明 不是半透明的 是透明的 我也在使用反应导航 就像这样使用它 测试使用 react native 0 60 4 和 0 61 5
  • ASP.NET MVC 列表框处理所选项目事件

    我在视图中使用 HTML ListBox 如下所示 这是用 IEnumerable 填充的
  • Objective-C - 测试对象实例被释放/释放

    有某种方法可以测试 Objective C 实例是否被释放 释放 保留计数 0 例如 对象 A 有一个指向对象 B 的引用 指针 但对象 B 可以在内存低级别中释放 我如何测试引用 B 以确保它已被释放 interface A NSObje
  • Base64 长度(以字节为单位)是多少?

    我有一个以 Base64 编码的文件 具有一定的文件长度 如何获取以字节为单位的大小 Example var size canvas toDataURL console log resizeCanvasURL length gt 13278
  • Android 6.0 原生 tgkill 崩溃

    从今天开始我就遇到了本地崩溃 据报道仅适用于Android 6 0 与堆栈跟踪 native pc 0000000000049c34 system lib libc so tgkill 12 native pc 00000000000474
  • 将 ODBC 应用程序与 JDBC 驱动程序结合使用

    我公司使用Vertica http www vertica com 我们有使用 pyodbc 连接到它的 Python 应用程序 我的大部分开发工作都是在 Mac Snow Leopard 上进行 不幸的是 Vertica 尚未发布适用于
  • 模拟 Retrofit 响应调用,但 Call 不起作用

    我正在嘲笑 APIService 的响应 不幸的是 它不起作用 我必须回电 但我不明白如何做 问题是如何发回 Call 对象 RunWith AndroidJUnit4 class class ApiServiceTest Test fun
  • 如何使用 API Gateway 上传 xls/xlsx 文件并将文件数据发送到 lambda 函数?

    我是 lambda 和 API 网关的新手 我使用此服务做了一些简单的事情 但现在我有一个要求 用户可以上传 Excel 文件 上传过程只是触发与 lambda 函数集成的 API 网关端点 我不想保存文件 我只想将文件数据以 CSV JS
  • 如何检查实体框架类型的属性是否可为 Null

    我有一个从数据库生成的 EntityDataModel 其中一个实体模型有两个属性 它们都是字符串类型 一个是 Nullable True 另一个是 Nullable False 如何在运行时检查 Nullable 属性的值 如果您的属性装
  • 如何从 Swagger API 声明生成 JSON-Schema

    我有 Swagger API 声明 用于使用招摇 v 1 2 https github com wordnik swagger spec blob master versions 1 2 md 我对 Swagger 的最初感觉是它非常接近