如何在java中以编程方式编辑swagger yaml文件,以便向REST端点添加请求参数?

如何在java中以编程方式编辑swagger yaml文件,以便向REST端点添加请求参数?,java,yaml,swagger,Java,Yaml,Swagger,我有一个由第三方库提供的yaml文件,包含5000多行。 需要读取该yaml文件,然后需要将查询参数“status”添加到 对于非GET方法,具有path/path/to/api的REST端点 编辑1: 我没有类文件或POJO。这是一个狂妄自大的亚马尔 我已经看过了SwaggerParser,但是我看到了很多用于读取yaml文件而不是添加到yaml文件中的代码片段。我会尝试Jackson库来处理yaml文件,因为它们都读写api(用法就像json一样) 有关更多信息,请参阅下面的帖子。 编辑:

我有一个由第三方库提供的yaml文件,包含5000多行。

需要读取该yaml文件,然后需要将查询参数“status”添加到
对于非GET方法,具有path/path/to/api的REST端点

编辑1: 我没有类文件或POJO。这是一个狂妄自大的亚马尔


我已经看过了SwaggerParser,但是我看到了很多用于读取yaml文件而不是添加到yaml文件中的代码片段。

我会尝试Jackson库来处理yaml文件,因为它们都读写api(用法就像json一样)

有关更多信息,请参阅下面的帖子。

编辑:在问题编辑的基础上,我稍微修改了答案,而不是将文件展开为pojo/类,我将使用映射将其强制转换为,对其进行必要的编辑,然后将其写回。
另一种更安全的方法是使用objectMapper.readTree()返回一个JsonNode,修改该节点,然后将其向后推

正如您正确指出的,您可以使用它修改OpenAPI/Swagger定义

请注意(截至2019年7月),有两个版本的Swagger Parser,它们使用稍微不同的包名和类名:

  • Swagger解析器2.0
    io.Swagger.v3.Parser.OpenAPIV3Parser
    )–读取Swagger 1.x、Swagger 2.0和OpenAPI 3.0格式,并编写OpenAPI 3.0

  • Swagger解析器1.x
    io.Swagger.Parser.Swagger解析器
    )–读取Swagger 1.x和Swagger 2.0格式,并写入Swagger 2.0

由于您的定义是Swagger 2.0,我假设您希望保留它,因此需要Swagger解析器1.x


以下是如何添加新参数:

import io.swagger.parser.SwaggerParser;
import io.swagger.models.Swagger;
import io.swagger.models.Operation;
import io.swagger.models.HttpMethod;
import io.swagger.models.parameters.QueryParameter;
import io.swagger.util.Yaml;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.util.Map;
...

Swagger swagger = new SwaggerParser().read("https://petstore.swagger.io/v2/swagger.json");

// Configure the "status" query parameter
QueryParameter status = new QueryParameter();
status.setName("status");
status.setType("string");
// You can also setDescription, setRequired, setExample, etc. as needed

// Get all HTTP methods for the "/pet/{petId}" path
Map<HttpMethod, Operation> operations = swagger.getPaths().get("/pet/{petId}").getOperationMap();

// Add the "status" parameter to non-GET methods only
for (Map.Entry<HttpMethod, Operation> op : operations.entrySet()){
    if (op.getKey() != HttpMethod.GET) {
        // TODO: Check if this operation already has
        // a query parameter named "status"

        op.getValue().addParameter(status);
    }
}

// Save the new file
try {
    // (Optional) Configure YAML formatter
    YAMLFactory factory = (YAMLFactory) Yaml.mapper().getFactory();
    factory.disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER)
        .enable(YAMLGenerator.Feature.MINIMIZE_QUOTES)
        .enable(YAMLGenerator.Feature.ALWAYS_QUOTE_NUMBERS_AS_STRINGS);

    String yaml = Yaml.pretty().writeValueAsString(swagger);
    FileUtils.writeStringToFile(new File("C:\\Work\\petstore-modified.yaml"), yaml);
}
catch (Exception e) {
    e.printStackTrace();
}
  • 与要添加的参数同名的现有路径级参数

    paths:
      /something:
        parameters:
          - in: query
            name: status
            type: string
    
  • 与$ref'referenced(而非内联定义)同名的现有参数

    paths:
      /something:
        parameters:
          - $ref: '#/definitions/statusQueryParam'
    
      /something2:
        post:
          parameters:
            - $ref: '#/definitions/statusQueryParam'
    
    parameters:
      statusQueryParam:
        in: query
        name: status
        type: string
    
  • 等等


  • 手动编辑文件不是更快/更容易吗?或者这将是一项重复性的任务?@helen编辑该文件将导致将来的维护难题。我想在构建过程中自动实现这一点,以便只修改我想要的路径。这是API定义
    swagger:'2.0'
    还是
    openapi:3.0.0
    还是两者都需要解决方案?@Helen it Is
    swagger:'2.0'
    paths:
      /something:
        parameters:
          - in: query
            name: status
            type: string
    
    paths:
      /something:
        parameters:
          - $ref: '#/definitions/statusQueryParam'
    
      /something2:
        post:
          parameters:
            - $ref: '#/definitions/statusQueryParam'
    
    parameters:
      statusQueryParam:
        in: query
        name: status
        type: string