如何在java中以编程方式编辑swagger yaml文件,以便向REST端点添加请求参数?
我有一个由第三方库提供的yaml文件,包含5000多行。如何在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文件,然后需要将查询参数“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(
)–读取Swagger 1.x、Swagger 2.0和OpenAPI 3.0格式,并编写OpenAPI 3.0io.Swagger.v3.Parser.OpenAPIV3Parser
- Swagger解析器1.x(
)–读取Swagger 1.x和Swagger 2.0格式,并写入Swagger 2.0io.Swagger.Parser.Swagger解析器
以下是如何添加新参数:
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
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 Isswagger:'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