java 如何在从swagger-ui发送请求时注入自定义头

yhxst69z  于 2023-03-06  发布在  Java
关注(0)|答案(1)|浏览(142)

我有这样的情况,当我想硬编码,头称为test-header,将存储简单的json数据{"username":"swagger", "email":"dummy@email"}。所以用户将使用swagger做请求不需要这样做,它将总是添加到每个请求从swagger-ui。
我在spring-boot v3中使用org.springdoc,目前我只有简单的OpenApi bean

@Bean
public OpenAPI customOpenAPI(@Value("${springdoc.version}") String appVersion) {
    return new OpenAPI()
            .info(new Info().title("Person API").version(appVersion)
                    .license(new License().name("Apache 2.0").url("http://springdoc.org")));
};

有没有可能以某种方式添加到它?或者我注定要使用过滤器/拦截器?

xytpbqjk

xytpbqjk1#

是的,可以通过Swagger UI传递一个带有默认值的自定义头。您可以使用下面的代码片段来自定义OpenAPI -

@Bean
public OpenApiCustomizer getCustomizer() {
    ObjectSchema myCustomSchema = new ObjectSchema();
    myCustomSchema.addProperty("username", new Schema<>().type("string")._default("swagger"));
    myCustomSchema.addProperty("email", new Schema<>().type("string")._default("dummy@email"));

    return openApi -> openApi.getPaths().values().stream()
            .flatMap(pathItem -> pathItem.readOperations().stream())
            .forEach(operation -> 
                operation.addParametersItem(
                        new HeaderParameter()
                                .name("test-header")
                                .required(false)
                                .schema(myCustomSchema).explode(true)
                                .style(Parameter.StyleEnum.SIMPLE)
                )
            );
}

这将在控制器中生成标题的值username=swagger,email=dummy@email
但是我建议如果你必须把JSON作为头文件来传递,那么就用字符串化的方式传递它,然后把它解析成控制器中的一个对象。

@Bean
public OpenApiCustomizer getCustomizer() {
    return openApi -> openApi.getPaths().values().stream()
            .flatMap(pathItem -> pathItem.readOperations().stream())
            .forEach(operation -> operation
                    .addParametersItem(
                            new HeaderParameter()
                                    .name("test-header")
                                    .required(false)
                                    .schema(new Schema().type("string")._default("{\"username\":\"swagger\", \"email\":\"dummy@email\"}"))
                    ));
}

请投赞成票,它有帮助。

相关问题