达夕博客
  • 首页
  • 软件工具
    • 提高生产力
    • 数字化办公
    • 智能手机
    • 开发工具
  • 技术编程
  • 互联网
  • 关于
  1. 首页
  2. 技术编程
  3. 正文

Swagger中过滤掉任意API接口的方法

2018年07月25日 18453点热度 2人点赞 0条评论

Swagger中过滤掉任意API接口的方法

Swagger是目前最受欢迎的REST APIs文档生成工具,同时也是API的在线测试工具。功能强大谁用谁知道。我就不用在这里推广它了。今天要解决的问题是:如果让一些特定的API接口在Swagger中不显示,即从Swagger中过滤掉一些不想展示的接口?

通常我们使用Swagger都是通过指定要扫描的包或者扫描具有某些注解的Controller,来生成API,那么如果这其中还想过滤掉一些特定API怎么做呢?可以在构建Docket的时候,在apis()方法中传入Predicate<RequestHandler>实例,来进行更加精细的过滤。

1、先看下Docket的定义,这里在apis方法中,传入Predicate<RequestHandler>列表

1
2
3
4
5
6
7
8
9
10
11
12
13
@Bean
public Docket getBusinessApiInfo() {
    return new Docket(DocumentationType.SWAGGER_2)
            .globalOperationParameters(setParams())
            .groupName("Default Api")
            .select()
            // 在这里我们代用一个私有方法apis(),传入Predicate<RequestHandler>列表
            .apis(Predicates.or(apis()))
            .paths(PathSelectors.any())
            .build()
            .apiInfo(businessApiInfo());
 
}

2、接下来是私有方法apis()的定义,使用Predicate<RequestHandler>可以拿到一个类型为RequestHandler参数,从RequestHandler中可以拿到一个API的详细信息,包括方法、注解,路径等信息,根据这些条件来判断是否需要过滤掉。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* 根据basePackage指定多个要扫描的包,然后再过滤掉一些特定的api
* @return
*/
private List<Predicate<RequestHandler>> apis() {
    List<Predicate<RequestHandler>> apis = new ArrayList<>();
    if (null != basePackages) {
        for (String basePackage : basePackages) {
            Predicate<RequestHandler> predicate = input -> {
                // basePackage包验证
                boolean basePackageIsOk = declaringClass(input).transform(handlerPackage(basePackage)).or(true);
 
                // 过滤掉特定的API
                boolean filterIsOk = true;
                try {
                    SwaggerApiFilter swaggerApiFilter = SpringContextHolder.getBean(SwaggerApiFilter.class);
                    filterIsOk = swaggerApiFilter == null ? true : swaggerApiFilter.apply(input);
                } catch (Exception e){
                    log.error("execute SwaggerApiFilter error: {}", e.getMessage());
                }
                return basePackageIsOk && filterIsOk;
            };
            apis.add(predicate);
        }
    }
    return apis;
}

3、SwaggerApiFilter是我定义的一个接口,用来编写具体的过滤方式。下面看一个该接口的具体实现类:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class MySwaggerApiFilter implements SwaggerApiFilter {
    @Override
    public boolean apply(RequestHandler input) {
 
        if (input instanceof WebMvcRequestHandler) {
            WebMvcRequestHandler handler = (WebMvcRequestHandler)input;
            HandlerMethod handlerMethod = handler.getHandlerMethod();
            // 已经拿到Handler和HandlerMethod了,尽情根据实际情况过滤吧。
            // 返回false表示不通过,返回true表示通过
        }
        return true;
    }
}

通过这种方式就可以过滤掉一些特定的API,不在Swagger的页面上展示了。

标签: Restful Swagger 过滤器
最后更新:2018年07月25日

达夕

保持饥渴的专注,追求最佳的品质

点赞
< 上一篇
下一篇 >

文章评论

取消回复

最新 热点 随机
最新 热点 随机
通过.git文件夹恢复代码仓库 Nginx 如何限流和访问控制(详解) Docker在宿主机上根据进程PID查找归属容器ID 云原生环境是使用Nocalhost开发调试Spring boot应用 全能数据库管理工具DataGrip推荐使用2019.3.5版本 安卓优秀播放器KMPlayer Plus (Divx)_v30.12.251下载 Intellij Idea 2020.3.1无限试用激活补丁 PDF全能解决方案Adobe Acrobat DC 2020 SP 直装特别版
Intellij Idea 2020.3.1无限试用激活补丁安卓优秀播放器KMPlayer Plus (Divx)_v30.12.251下载全能数据库管理工具Navicat 15 旗舰版x64位安装激活IntelliJ IDEA 开发助手插件DevHelper 1.0.2版本发布全能数据库管理工具DataGrip推荐使用2019.3.5版本v2ray启动报code=exited, status=218/CAPABILITIES错误的解决方法Nginx 如何限流和访问控制(详解)PDF全能解决方案Adobe Acrobat DC 2020 SP 直装特别版
Shadowsocks安卓版下载备份 【转】解决IntelliJ Idea Terminal命令中GIT不支持中文问题 [收藏]查看Windows激活信息的方法,附Windows 10 各版本官方原版下载 卸载Windows10应用商店中自带软件的方法 重新整理:我的印象笔记Evernote的分类方法和标签使用技巧 Intellij Idea开启RunDashboard配置 大席的博客更新公告 IntelliJ IDEA 开发助手插件DevHelper 1.0.2版本发布
标签聚合
Windows 10 IntelliJ Idea 激活 Dropbox 敏捷开发 iPhone Google Drive Evernote 印象笔记 Google Chrome
推荐文章

COPYRIGHT © 2020 达夕博客. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS