我有使用Swagger v 1.2的服务的Swagger API声明。
我最初对Swagger的感觉是,它非常接近JSON Schema(Draft 3和最近的Draft 4),为请求和响应对象生成JSON Schema应该相对容易。
然而,虽然Swagger的一部分重用了JSON Schema结构,但事实证明它只使用了一个特性子集,而且它还在模型中引入了自己的继承(使用subTypes
和discriminator
)。
问:是否有任何现有的项目或代码可以从Swagger API声明生成可用的JSON模式?
最好是JSON模式草案4和使用Python(但我会很高兴找到任何东西)。
7条答案
按热度按时间ugmeyewa1#
在使用Swagger指定REST API并在相关测试套件中重用它的过程中,经过了较长时间的斗争,我将与它分享我自己的经验(回答我自己的问题)。
Swagger仅支持JSON模式草案4的子集
Swagger 1.2和2.0规范规定,它只支持JSON Schema Draft 4的子集(此处为s.)。这意味着:
换句话说就是:
在实践中,您不能从JSON或XML中设计数据开始,使用Swagger时,您必须从Swagger开始并以其结束。
获取JSON模式在理论上是可行的,但并不容易
我已经花了一些时间编写了一个库,它将采用Swagger API规范并创建JSON Schema Draft 4。我放弃的原因有两个:
除了有非常好看的UI来显示和测试API(是的,每个人都同意,它在视觉上非常令人愉快),我发现它很奇怪,规范框架不允许我们使用我们想要的,而是给我们的设计增加了意想不到的限制。
如果您想要完整的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中设计有效负载
1.通过RAML(目前为v0.8)描述REST API。
也许还有其他的规范框架可以使用,但是Swagger(v1.2和v2.0都不是)绝对不是这样的。除了提供了很多特性(代码生成,非常漂亮的API文档等等),它只是没有提供上面提到的更新问题的解决方案。
9rbhqvlz2#
有一个名为openapi2jsonschema的python工具可以做同样的事情。你可以简单地使用
pip
安装它。openapi2的自述文件给出了最简单的使用方法:
希望这对你有帮助。
f87krz0w3#
我刚刚写了一个工具pyswagger似乎适合你的需要。
它加载Swagger API声明,能够将python对象转换为Swagger原语/从Swagger原语转换为python对象**。还提供了一组客户端实现(包括requests&tornado.httpclient.AsyncHTTPClient),能够直接向支持Swagger的服务发出请求。
这个工具解决了我在Python中使用Swagger时遇到的第一个问题,现在仍然很新。欢迎提出任何建议。
cbeh67ev4#
我曾经这样做过:
yaml -〉原-〉jsonschema
我使用openapi2proto从Swagger yaml生成proto文件,然后使用protoc-gen-jsonschema从该文件生成JSONSchemas。获得类型化的JSONSchema已经足够了,但是proto 3不支持“必需的”类型,所以您错过了这一点。
hi3rlvi25#
我编写了一个递归函数,用于从Swagger定义创建json模式。
例如,考虑swagger规范petstore-minimal
定义Pet被转换为下面的json-schema
当然,这是一个非常小的json模式,但是使用我编写的函数可以实现更多的功能。
为了创建json模式,我使用了下面的maven依赖项
现在到了编码部分,输入是swagger规范的位置,也是我们需要转换为json模式的定义名称。
现在,我们需要处理作为输入传递的swagger定义,并递归地处理定义的属性
因此,为了创建json模式,我创建了自己的自定义json模式类。这是针对每种json模式数据类型的。
下面是我为每种json数据类型创建的抽象
第一个问题
注意事项
这是我根据自己的需要所做的自定义实现,如果您遇到任何其他数据类型,只需通过扩展
JsonProperty
类并提供toJsonObject
实现来创建该类型。快乐编码
e0bqpujr6#
使用Swagger UI进行文档化,突出显示的链接返回您的API模式的json对象:
klr1opcd7#
将OpenApi安装到Jsonschema提取器:
打开终端-执行以下命令