我从一些JSON文件创建了一个API规范,现在想测试这些文件是否符合API规范。
有一些很好的工具可以验证JSON Schema,但我没有找到一个能够验证Swagger(用于创建API架构的工具)规范的工具。我唯一找到的解决方案是在Swagger-Editor中生成客户端/服务器,但这很麻烦。
是否已经有现成的工具可以验证JSON是否符合Swagger Schema?
我从一些JSON文件创建了一个API规范,现在想测试这些文件是否符合API规范。
有一些很好的工具可以验证JSON Schema,但我没有找到一个能够验证Swagger(用于创建API架构的工具)规范的工具。我唯一找到的解决方案是在Swagger-Editor中生成客户端/服务器,但这很麻烦。
是否已经有现成的工具可以验证JSON是否符合Swagger Schema?
阿尔诺在评论中正确指出这里有两个单独的问题。
您想验证您的规范是否是有效的OpenAPI(前身为Swagger)规范吗?
您可以:
还是验证该规范的实现将生成符合您的JSON模式的JSON?
换句话说,这里是一些请求或响应正文的JSON,它们是否正确?
Swagger依赖于另一项称为JSON Schema的标准进行其模式对象,这些对象实际上描述了JSON(而不是端点或元数据)。 Swagger使用JSON Schema的子集(缺少:oneOf
,patternProperties
等)。为此,您可以使用JSON Schema验证器。这里列出了37个验证器;我要向这个在线验证器致敬,它还支持YAML模式。
但是,当我说Swagger依赖于JSON API的子集时,我撒谎了。在Swagger中,有一些固定的字段具有特殊意义,这些字段不属于JSON Schema的范畴。其中之一是discriminator
,用于多态性。 我不知道是否有可以处理discriminator
的Swagger验证器。 有一些Swagger工具可以进行验证,但其中许多都已被废弃,只适用于旧版,功能不完整,与其他技术绑定等等。如果有成熟且维护良好的库我不知道的话,我很想知道。
用于根据OpenAPI / Swagger规范验证请求/响应的Java库。 包括对Swagger v2和OpenAPI v3规范的支持以及常见模拟和测试库的适配器。
核心库不绑定任何特定的HTTP库,但他们还提供了其他模块,可与Spring MVC、MockMVC、REST Assured等集成。
还有swagger-schema-validator可以根据Swagger V2定义验证JSON文档(免责声明:我是作者)。不过此Java库比Atlassian的库功能更少。
使用https://github.com/bjansen/swagger-schema-validator,可以通过最小的Java代码对一个.json
负载文件进行离线验证,以确保其符合一个.yaml
Swagger规范:
按照swagger-schema-validator自述文件中的说明,在您自己的项目中引用依赖项,或者使用git clone https://github.com/bjansen/swagger-schema-validator.git
将其克隆到本地。
将您的.yaml
和.json
文件复制到测试根目录下的src/test/resources
文件夹中。
创建一个测试类,其中包含以下内容(请确保将"/definitions/MyPayloadObjectMustBeSetHere"
更改为指向您自己的定义):
import com.github.bjansen.ssv.SwaggerValidator;
import com.github.fge.jsonschema.core.report.ProcessingReport;
import static org.junit.jupiter.api.Assertions.assertEquals;
@Test
void SwaggerSpecTest() {
InputStream spec = getClass().getResourceAsStream("/api/swagger.yaml");
SwaggerValidator validator = SwaggerValidator.forYamlSchema(new InputStreamReader(spec));
InputStreamReader sample = new InputStreamReader(getClass().getResourceAsStream("/api/payload.json"));
ProcessingReport report = validator.validate(CharStreams.toString(sample), "/definitions/MyPayloadObjectMustBeSetHere");
assertEquals("success", report.toString()); // force printing the errors/warnings
}
OpenAPI 2.0 / Swagger 架构在多个位置可用,只是由于 Swagger 中单词“schema”的频繁使用,有点难找。
因此,您可以将通用验证器指向此架构和文档。例如,对于我来说,这在使用 vscode 和红帽 YAML 扩展时非常有效。