Swagger 3 必需的全局请求参数

Swagger 3 Required Global Request Parameter

我正在使用 Spring Boot 2.5.4 和 Swagger 3。我在 Swagger 配置文件中添加了一个 header 和 required=true 类型的全局请求参数。 Swagger UI 在所有 API 中正确显示了所需的请求 header,但问题是它允许在所需请求 header 的值为空时发送请求。在 Swagger 2 中,UI 用于在值被填充之前禁用发送请求。

任何建议。

@Bean
    public Docket api() {

        RequestParameterBuilder aParameterBuilder = new RequestParameterBuilder();
        aParameterBuilder.name("x-remote-user").description("Remote User").in(ParameterType.HEADER).required(true)
                .build();

        List<RequestParameter> aParameters = new ArrayList<>();
        aParameters.add(aParameterBuilder.build());
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
                .securityContexts(Arrays.asList(securityContext())).securitySchemes(Arrays.asList(apiKey())).select()
                .apis(RequestHandlerSelectors.basePackage("com.xxx.controller"))
                .paths(PathSelectors.ant("/api/**")).build().globalRequestParameters(aParameters);
    }

我找到了解决办法。如果其他人正在寻找它,请将其张贴在这里。

如果我们不允许空值,那么 swagger UI 开始阻止我们执行 API 如果 header 值保持为空。

@Bean
    public Docket api() {

        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
                .securityContexts(Arrays.asList(securityContext())).securitySchemes(Arrays.asList(apiKey())).select()
                .apis(RequestHandlerSelectors.basePackage("com.xxx.controller"))
                .paths(PathSelectors.ant("/api/**")).build()
                .globalRequestParameters(Arrays.asList(new RequestParameterBuilder().name("x-remote-user")
                        .description("Remote User").in(ParameterType.HEADER).required(true)
                        .query(simpleParameterSpecificationBuilder -> simpleParameterSpecificationBuilder
                                .allowEmptyValue(false).model(modelSpecificationBuilder -> modelSpecificationBuilder
                                        .scalarModel(ScalarType.STRING)))
                        .build()));
    }

也许对你有帮助

    private SecurityContext securityContext() {
        return SecurityContext.builder()
                .securityReferences(defaultAuth())
                .operationSelector(this::selector)
                .build();
    }
    boolean selector(OperationContext operationContext) {
        String url = operationContext.requestMappingPattern();
        // filter url
        return true;
    }

    private List<SecurityReference> defaultAuth() {
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "Authorization header");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        return Collections.singletonList(new SecurityReference("Authorization", authorizationScopes));
    }

    private List<SecurityScheme> securitySchemeList(){
        ApiKey apiKey = new ApiKey("Authorization", "Authorization token", "header");
        return Collections.singletonList(apiKey);
    }

    private List<RequestParameter> globalRequestParameters() {
        RequestParameterBuilder parameterBuilder = new RequestParameterBuilder()
                .in(ParameterType.HEADER)
                .name("Authorization")
                .required(true)
                .query(param -> param.model(model -> model.scalarModel(ScalarType.STRING)));
        return Collections.singletonList(parameterBuilder.build());
    }

    @Bean
    public Docket authorization() {
        return new Docket(DocumentationType.OAS_30)
                .apiInfo(apiInfo())
                .securityContexts(Collections.singletonList(securityContext()))
                .securitySchemes(securitySchemeList())
                .globalRequestParameters(globalRequestParameters())
                .select()
                .paths(PathSelectors.regex("^(?!/error).*"))
                .build()
        ;
    }