【问题标题】:How to generate JSON examples from OpenAPI/Swagger model definition?如何从 OpenAPI/Swagger 模型定义生成 JSON 示例?
【发布时间】:2017-05-15 11:52:05
【问题描述】:

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

【问题讨论】:

    标签: json swagger swagger-2.0 swagger-codegen openapi


    【解决方案1】:

    Swagger Inflector 库具有专门用于此目的的 ExampleBuilder 类。它允许您从 OpenAPI (Swagger) 定义中的模型生成 JSON、XML 和 YAML 示例。

    OpenAPI 2.0 示例

    要使用 OpenAPI 2.0 (swagger: '2.0') 定义,请使用 Swagger Java 库 1.x

    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);
    

    OpenAPI 3.0 示例

    对于 OpenAPI 3.0 示例,see this answer。您需要 Swagger Java 库的 2.x 版本,并适当地更新导入和类名,例如将io.swagger.parser.SwaggerParser 更改为io.swagger.v3.parser.OpenAPIV3Parser 等等。

    【讨论】:

    • 这就像桃子一样工作,几乎在寻找解决方案一年后我找到了这个!
    • 不幸的是,在 JSON 输出中创建字符串字段时,ExampleBuilder 不尊重 minLength 和 maxLength 属性(它总是将“字符串”放在字符串字段中)。这可能会导致“格式错误”的 JSON。您可以通过创建自己的 StringProperty 对象来解决此问题,但这违背了拥有构建器的目的。
    • @Joman68 你可以在github.com/swagger-api/swagger-inflector/issues 上打开一个问题(或者,更好的是,提交一个 PR)。作为一种解决方法,您可以修改 API 定义,为每个属性提供自定义 example,Inflector 将使用这些示例。
    • swagger-inflector,仅在模式定义简单和基本时才有效。它不识别oneOfanyOfallOf,它不处理任何使用$ref 的引用,它不遵循任何pattern
    • @Tiina ExampleBuilder 支持allOf$refoneOfanyOf。对于oneOf/anyOf,它应该使用第一个子模式。如果您得到不正确/不完整的示例,请在github.com/swagger-api/swagger-inflector/issues 上打开一个问题。确保使用 editor.swagger.io 和/或其他验证器检查您的 OpenAPI 定义是否存在语法错误。您还可以通过为 API 定义中的某些架构/属性提供自己的 example 来解决 ExampleBuilder 的限制。
    【解决方案2】:

    我的经验:

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

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

    【讨论】:

      【解决方案3】:

      只需将您的模型放入 https://json-schema-faker.js.org/ 即可。

      您提供的架构只需稍作修改即可正常工作:删除“Pets”并添加“Category”和“Tag”的定义。请参阅下面的示例。

      然后点击“生成”,你会得到假数据。如果您不想浏览网站,这一切似乎都可以通过库以编程方式完成(虽然我自己没有尝试过)。

      {
        "definitions": {
          "description": "making this up so all refs resolve",
          "Category": {
            "type": "string"
          },
          "Tag": {
            "type": "string"
          }
        },
        "comment": "From here on down, it's exactly the same as the OP schema",
        "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"
          }
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2022-01-16
        • 2018-08-22
        • 2021-01-01
        • 2019-09-22
        • 2021-11-14
        • 2020-02-10
        • 2015-12-02
        • 2015-01-22
        • 1970-01-01
        相关资源
        最近更新 更多