如何从 OpenAPI/Swagger 模型定义生成 JSON 示例?

You*_*iga 9 json swagger swagger-2.0 openapi swagger-codegen

我正在为具有 OpenAPI (Swagger) 定义的 REST API 构建模糊器。

我想测试 OpenAPI 定义中的所有可用路径,生成数据以测试服务器,分析响应代码和内容,并验证响应是否符合 API 定义。

我正在寻找一种从模型定义生成数据(JSON 对象)的方法。

例如,给定这个模型:

...
"Pet": {
  "type": "object",
  "required": [
    "name",
    "photoUrls"
  ],
  "properties": {
    "id": {
      "type": "integer",
      "format": "int64"
    },
    "category": {
      "$ref": "#/definitions/Category"
    },
    "name": {
      "type": "string",
      "example": "doggie"
    },
    "photoUrls": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "tags": {
      "type": "array",
      "items": {
        "$ref": "#/definitions/Tag"
      }
    },
    "status": {
      "type": "string",
      "description": "pet status in the store"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我想生成随机数据并得到如下内容:

{
  "id": 0,
  "category": {
    "id": 0,
    "name": "string"
  },
  "name": "doggie",
  "photoUrls": [
    "string"
  ],
  "tags": [
    {
      "id": 0,
      "name": "string"
    }
  ],
  "status": "string"
}
Run Code Online (Sandbox Code Playgroud)

Hel*_*len 8

扬鞭变形器库具有ExampleBuilder类正是为了这个目的。它允许您从 OpenAPI (Swagger) 定义中的模型生成 JSON、XML 和 YAML 示例。

import io.swagger.parser.SwaggerParser;
import io.swagger.models.*;
import io.swagger.inflector.examples.*;
import io.swagger.inflector.examples.models.Example;
import io.swagger.inflector.processors.JsonNodeExampleSerializer;
import io.swagger.util.Json;
import io.swagger.util.Yaml;
import java.util.Map;
import com.fasterxml.jackson.databind.module.SimpleModule;

...

// Load your OpenAPI/Swagger definition
Swagger swagger = new SwaggerParser().read("http://petstore.swagger.io/v2/swagger.json");

// Create an Example object for the Pet model
Map<String, Model> definitions = swagger.getDefinitions();
Model pet = definitions.get("Pet");
Example example = ExampleBuilder.fromModel("Pet", pet, definitions, new HashSet<String>());
// Another way:
// Example example = ExampleBuilder.fromProperty(new RefProperty("Pet"), swagger.getDefinitions());

// Configure example serializers
SimpleModule simpleModule = new SimpleModule().addSerializer(new JsonNodeExampleSerializer());
Json.mapper().registerModule(simpleModule);
Yaml.mapper().registerModule(simpleModule);

// Convert the Example object to string

// JSON example
String jsonExample = Json.pretty(example);
System.out.println(jsonExample);

// YAML example
String yamlExample = Yaml.pretty().writeValueAsString(example);
System.out.println(yamlExample);

// XML example (TODO: pretty-print it)
String xmlExample = new XmlExampleSerializer().serialize(example);
System.out.println(xmlExample);
Run Code Online (Sandbox Code Playgroud)

上面的示例使用 Swagger Java 库 1.x,它支持 OpenAPI 2.0 定义 ( swagger: '2.0')。

如果您的 API 定义是 OpenAPI 3.0 ( openapi: 3.0.0),您需要使用 Swagger Java 库的 2.x 版,并适当更新导入和类名称,例如io.swagger.parser.SwaggerParserio.swagger.v3.parser.OpenAPIV3Parser, 等等。

  • 这就像桃子一样,几乎在寻找解决方案一年后我发现了这个! (2认同)

小智 3

我的经验:

  1. 访问http://editor.swagger.io
  2. 文件 -> 导入文件(加载我自己的 Swagger 描述)
  3. 生成客户端 -> Java(在我的例子中)
  4. 下载并解压客户端
  5. 将其模型包导入到任何简单的项目中,用您需要的数据实例化并填充模型的类
  6. 将实例化的对象编组为 JSON(我的案例 - Gson,因为生成的模型由 Gson 注释进行注释)
  7. 利润

简而言之:根据 Swagger 定义生成客户端(在我的例子中为 java-client),填充其模型并编组结果。