当前位置: 首页 > 知识库问答 >
问题:

Swagger 3必需的全局请求参数

华建同
2023-03-14

我用的是Spring Boot 2.5.4和Swagger 3。我在Swagger配置文件中添加了一个全局请求参数作为类型头,required=true。Swagger UI在所有API中正确地显示了所需的请求头,但问题是它允许在所需请求头的值为空时发送请求。在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);
    }

共有2个答案

蒋华美
2023-03-14

也许对你有帮助

    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()
        ;
    }
米俊晤
2023-03-14

我找到了解决方案.如果其他人正在寻找它,请在此处发布.

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

@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()));
    }
 类似资料:
  • 本文向大家介绍vue+axios全局添加请求头和参数操作,包括了vue+axios全局添加请求头和参数操作的使用技巧和注意事项,需要的朋友参考一下 走登录的接口都会返回一个token值,然后存起来方便之后调接口的时候给后台传过去,传给后台的方式有两种:(具体使用哪种需要和后台商量) 1、放在请求头中 2、放在接口的参数中 1、放在请求头中 下面代码是从本地cookie中拿token VueCook

  • 问题内容: 这个问题非常简单和技术性: 我要实现的是: 有没有办法做到这一点?如果不是,可以返回一个值应用于? 问题答案: 您期望的是 同步 ( 阻塞 )类型的请求。 默认情况下 ,请求是 异步的 ( 非阻塞 ),这意味着浏览器不会等待它们完成才能继续工作。这就是为什么您的警报得到错误结果的原因。 现在,您可以选择将请求设置为 sync ,这意味着脚本将仅在请求完成 后 继续运行。 该 建议的 方

  • 基于Web中的示例创建了两个应用程序:Angular中的Frontend和customer)Angular URL:http://localhost:4200/Spring Boot URL:http://localhost:9020/(REST:http://localhost:9020/API/) 根据这里的专家对我前面问题的说明(https://stackoverflow.com/posts

  • 问题内容: 如果我将@Builder添加到类中。创建了builder方法。 我有一个需要特定字段的要求。在这种情况下,名称字段是必填字段,而不是姓氏。理想情况下,我想这样声明。 我不知道该怎么做。我尝试将@Builder添加到构造函数中,但没有成功。 问题答案: 您可以使用Lombok批注配置轻松完成此操作 然后像那样使用 当然这里是可选的。

  • (我更喜欢)或 只需使用调用,值应存储在该请求的某个位置。 我知道可能更简单,因为它已经击中了正确的,但我更喜欢。 我刚刚意识到,不能像预期的那样工作,因为Spring Security总是首先处理请求。不过我需要一个拦截器在Spring安全启动之前处理它。

  • 问题内容: 是否可以定义每个日志语句中包含的唯一请求ID,而无需将记录器交给每个方法/函数调用? 使用的技术:NodeJS,Express,Winston 问题答案: 已编辑 最后,我创建了一个库,可以完成所有工作。 https://github.com/davicente/express-logger-unique-req- id 它是Winston库的包装,因此您可以以相同的方式使用它。 让我