大摇大摆地过滤 API 个部分

Filtering for API parts in swagger

我有一个 REST API 和 springfox swagger v2.6.1,并且可以正常工作。但是现在,我不想总是显示我拥有的所有控制器,因为其中一些非常技术性,不适合普通用户,但我希望能够选择我显示的内容而无需重新编译代码。页面顶部有一个下拉字段,上面写着 'default (/v2/api-docs)'(或您配置的任何内容),只有一个条目。我的直觉是那里应该可以有多个选项,并根据选项显示某些控制器 类 或不显示。

由于我不太会上传图片,所以无法提供截图。无论如何,我希望我的问题很清楚。

在我的项目中做 swagger 的代码是最简单的:

@Bean
public Docket api() {

    return new Docket( DocumentationType.SWAGGER_2 )
            .select()
                .apis( RequestHandlerSelectors.any() )
                .paths( PathSelectors.any() )
                .build()
            .apiInfo( metadata() );
}

private ApiInfo metadata() {
    return new ApiInfoBuilder()
            .title( "My awesome ACS API" )
            .description( "All the requests that the server will respond to." )
            .version( "1.0.0" )
            .build();
}

我尝试了几种方法,比如添加一些属性,为不同的东西做两个 .select() 和 selecting,但我似乎并没有真正接近我希望的东西实现。

感谢您的帮助!

我能想到的一些方案

  1. 您可以使用 SpringSecurity 将身份验证添加到不同的端点,并使端点完全不可访问(但在 Swagger 中可见 UI)。

  2. 您在顶部提到的下拉菜单可以这样配置

    @Bean
    public Docket orderApi() {
        // This will group the endpoints strting with /order.   
        // And it will be visible as a separate group in the drop down(In Swagger UI) 
        // with the name 'order' as specified in the groupName(..)
        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("order")
                .apiInfo(metadata())
                .select()
                .paths(PathSelectors.ant("/order/**"))
                .build();
    }
    
    @Bean
    public Docket orderValidationApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("product")
                .apiInfo(metadata())
                .select()
                .paths(PathSelectors.ant("/product/**"))
                .build();
    }
    
  3. 您可以在 Docker 配置

    中完全排除端点在 Swagger UI 中可见
       return new Docket( DocumentationType.SWAGGER_2 )
            .select()
                .apis( RequestHandlerSelectors.any() )
                .paths(PathSelectors.regex("(?!/error).+")).paths(PathSelectors.regex("(?!/product).+"))
                .build()
            .apiInfo( metadata() );  
    

    这将使所有不是 /error 和 /product 的端点可用。您可以像这样过滤掉端点。

您也可以提供包名

@Bean
public Docket api() {

    return new Docket( DocumentationType.SWAGGER_2 )
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.hello.world.controller.user"))
            .paths( PathSelectors.any() )
            .build()
            .apiInfo( metadata() );
}

或者您可以为您的 API 类 或 API 方法使用自定义注释,如下所示:

@Bean
public Docket api() {

    return new Docket( DocumentationType.SWAGGER_2 )
            .select()
            .apis(RequestHandlerSelectors.withClassAnnotation(MyCustomClassAnnotation.class))
            .paths( PathSelectors.any() )
            .build()
            .apiInfo( metadata() );
}



@Bean
public Docket api() {

    return new Docket( DocumentationType.SWAGGER_2 )
            .select()
            .apis(RequestHandlerSelectors.withMethodAnnotation(MyCustomMethodAnnotation.class))
            .paths( PathSelectors.any() )
            .build()
            .apiInfo( metadata() );
}