最近我们有一个需求,就是把各个系统的swagger文档集中在一起。有了这么一个需求之后,我去百度了,结合swagger的源码实现了一下
首先我们可以先看看单个系统的swagger页面,
第一部分是一个下拉框,就是一个选择swagger资源的下拉框,默认就是本应用;
第二部分是一个请求,是第一部分数据的请求
第三部分是第二部分请求的一个结果展示,json部分一共有三个key,由图片可知第一个key是name,第二个key是location。也就是这个资源的访问url,第三个key是version,也就是版本号
根据我们自己的需求,怎么将各个系统的api数据集中在一起呢?其实思路可以从我上面的截图得到。
步骤1:
首先要先从swagger源码中找到第二步的请求源码,如下
红线区域是核心,主要就是生成swaggerResource返回给前端,默认是只返回本document的swaggerResource。
步骤2:
理解步骤1之后,其实我们可以大概能想象怎么处理我们之前的需求。处理方式就是自定义resourceProvide类实现SwaggerResourceProvider接口,然后我们只要重写get方法,代码如下:
@Component
@Primary
class MySwaggerResourcesProvider implements SwaggerResourcesProvider {
@Override
public List<SwaggerResource> get() {
List resources = new ArrayList<>();
resources.add(swaggerResource("service-a", "/swagger-service-a/v2/api-docs", "2.0"));
resources.add(swaggerResource("service-b", "/swagger-service-b/v2/api-docs", "2.0"));
return resources;
}
private SwaggerResource swaggerResource(String name, String location, String version) {
SwaggerResource swaggerResource = new SwaggerResource();
swaggerResource.setName(name);
swaggerResource.setLocation(location);
swaggerResource.setSwaggerVersion(version);
return swaggerResource;
}
}
主要是get方法,代码主要把增加了各个系统的swaggerResource(数据访问来源),
SwaggerResource有三个参数,
第一个参数:名称,也就是之前那个下拉框的选择条名称
第二个参数:url,就是访问具体系统swagger的链接
第三个参数:version ,就是swagger的版本
之后就启动网关项目,访问网关项目的swagger地址就可以看到各个系统集中的api数据了