首页 文章

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

提问于
浏览
2

我正在为具有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"
    }
  }
}

我想生成随机数据,得到这样的东西:

{
  "id": 0,
  "category": {
    "id": 0,
    "name": "string"
  },
  "name": "doggie",
  "photoUrls": [
    "string"
  ],
  "tags": [
    {
      "id": 0,
      "name": "string"
    }
  ],
  "status": "string"
}

2 回答

  • 1

    我的经验:

    • 转到http://editor.swagger.io

    • 文件 - >导入文件(加载我自己的Swagger描述)

    • 生成客户端 - > Java(在我的例子中)

    • 下载并解压缩客户端

    • 使用您需要的数据导入's model package into any simple project, instantiate and fill model'的类

    • 将实例化对象转换为JSON(我的情况 - Gson,因为生成的模型由Gson注释注释)

    • 利润

    简而言之:基于Swagger定义生成客户端(在我的情况下是java-client),填充它的模型并编组结果 .

  • 2

    Swagger Inflector库完全具有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);
    

    上面的示例使用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

相关问题