我建立一个REST API具有提供的OpenAPI(扬鞭)定义一个模糊器。
我想测试向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"
}
该Swagger Inflector库具有ExampleBuilder
类正是为了这个目的。它可以让你产生提供的OpenAPI(扬鞭)定义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);
上面的示例使用扬鞭Java库1.x中,它们支持的OpenAPI 2.0定义(swagger: '2.0'
)。
如果您的API定义的OpenAPI 3.0(openapi: 3.0.0
),则需要适当地使用扬鞭Java库的版本2.x和更新的进口和类名,例如io.swagger.parser.SwaggerParser
→io.swagger.v3.parser.OpenAPIV3Parser
等
我的经验:
总之:基于扬鞭定义生成客户端(在我的情况Java的客户端),填充它的模型和编组的结果。