最近我們有一個需求,就是把各個系統的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數據了