根据Swagger API模式验证JSON

bq3bfh9z  于 2023-08-05  发布在  其他
关注(0)|答案(5)|浏览(168)

我从一些JSON文件创建了一个API规范,我试图测试这些文件是否符合API规范。
有一些很好的工具来验证JSON模式,但是我没有机会找到一个工具来验证Swagger(用于创建API模式的工具)中创建的规范。我发现的唯一解决方案是在Swagger-Editor中生成一个客户端/服务器,这非常麻烦。
是否已经有一个针对Swagger Schema验证JSON的工具?

ijnw1ujt

ijnw1ujt1#

阿诺德在评论中说这里有两个独立的问题是正确的。
是否要验证规范是否为有效的OpenAPI(fka. Swagger)规格
您可以选择

  • 将你的规范复制到在线Swagger编辑器中,它会抛出错误。快速浏览source并不能告诉我它是用什么来创建这些错误的,但它似乎并没有联系服务器来做这件事。
  • 使用官方的swagger-parser for Java。
  • 使用非官方的swagger-parser for JavaScript(浏览器或Node)。

或者验证此规范的实现将产生对于您的JSON模式有效的JSON?
换句话说,这里有一些来自请求或响应主体的JSON,它正确吗?
Swagger依赖于另一个名为JSON Schema的标准来实现其模式对象,这些对象实际上描述了JSON(而不是端点或元数据)。Swagger使用JSON Schema的一个子集(缺少:oneOfpatternProperties等)。为此,您可以使用JSON Schema验证器。有37 listed here;我将向也支持YAML模式的this online validator给予一声大喊。
但是,当我说Swagger依赖于JSON API的子集时,我撒谎了。在Swagger中,有一些固定字段具有特殊的含义,它们不是JSON Schema的一部分。其中一个是discriminator,用于多态性。我不知道Swagger验证器可以处理discriminator。有一个fair number of tools用于swagger,也有一些声称可以进行验证,但许多都是废弃软件,用于旧版本,功能不完整,与其他技术绑定,等等。如果有一个成熟和维护良好的图书馆,我错过了,我很想知道。

bqucvtff

bqucvtff2#

Atlassian's swagger-request-validator是一个Java库,它可以执行这样的验证:
一个Java库,用于根据OpenAPI / Swagger规范验证请求/响应。包括对Swagger v2和OpenAPI v3规范的支持,以及用于通用模拟和测试库的适配器。
核心库不绑定到任何特定的HTTP库,但它们还提供了与Spring MVC,MockMVC,REST Assured等集成的其他模块。
还有一个swagger-schema-validator可以根据Swagger V2定义验证JSON文档(免责声明:我是作者)。不过,这个Java库不如Atlassian的完整。

inn6fuwd

inn6fuwd3#

如果你的Swagger JSON是托管的,你可以使用以下URL:http://online.swagger.io/validator/debug?url=your_url

3vpjnl9f

3vpjnl9f4#

Java swagger验证

使用https://github.com/bjansen/swagger-schema-validator根据.yaml swagger规范对.json有效负载文件进行离线验证的最少Java代码:
1.在您自己的项目中引用依赖项,如swagger-schema-validator自述文件中所述,或者使用git clone https://github.com/bjansen/swagger-schema-validator.git进行本地克隆。
1.将.yaml.json文件复制到测试根文件夹下的src/test/resources文件夹中。
1.创建一个包含如下内容的测试类(确保将"/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
}

字符串

iklwldmw

iklwldmw5#

OpenAPI 2.0 / Swagger模式在一些地方可用,只是有点难以找到,因为swagger本身大量使用了“schema”一词。

因此,您可以将通用验证器指向此模式和文档。例如,我使用vscode和Red Hat的YAML扩展就可以很好地工作。

相关问题