<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
使用原生的swagger作為介面檔案,功能不夠強大,並且預設的ui比較簡陋,不符合大眾審美。所以實際開發中推薦使用knife4j對swagger進行增強。knife4j的地址:https://gitee.com/xiaoym/knife4j
想要使用knife4j非常簡單,只要在Springboot專案中引入knife4j的依賴即可
<dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <version>2.0.9</version> </dependency>
注意:引入knife4j後會自動引入swagger相關依賴
所以無需再手動引入swagger相關依賴,否則會引起版本衝突,在使用knife4j的一些增強功能時會報錯
我們首先搭建springboot環境,建立2個Controller,用swagger相關注解來描述
// Controller1 @RestController @RequestMapping("controller1") @Api(tags = "應用1-Controller1") public class Controller1 { @GetMapping("api1/{id}") @ApiOperation("api1") public void api1(@PathVariable("id") @ApiParam("使用者id") Long id) { } @PostMapping("api2") @ApiOperation("api2") public void api2(@RequestBody User user) { } } // Controller2 @RestController @RequestMapping("controller2") @Api(tags = "應用1-Controller2") public class Controller2 { @GetMapping("api1/{id}") @ApiOperation("api1") public void api1(@PathVariable("id") @ApiParam("使用者id") Long id) { } @PostMapping("api2") @ApiOperation("api2") public void api2(@RequestBody User user) { } } // 實體類 @Data @ApiModel("使用者實體") public class User { @ApiModelProperty("姓名") private String name; @ApiModelProperty("年齡") private Integer age; }
然後建立swagger設定類
@Configuration @EnableSwagger2WebMvc public class SwaggerConfig { // 建立Docket存入容器,Docket代表一個介面檔案 @Bean public Docket webApiConfig(){ return new Docket(DocumentationType.SWAGGER_2) // 建立介面檔案的具體資訊 .apiInfo(webApiInfo()) // 建立選擇器,控制哪些介面被加入檔案 .select() // 指定@ApiOperation標註的介面被加入檔案 .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) .build(); } // 建立介面檔案的具體資訊,會顯示在介面檔案頁面中 private ApiInfo webApiInfo(){ return new ApiInfoBuilder() // 檔案標題 .title("標題:使用者管理系統介面檔案") // 檔案描述 .description("描述:本檔案描述了使用者管理系統的介面定義") // 版本 .version("1.0") // 聯絡人資訊 .contact(new Contact("baobao", "http://baobao.com", "baobao@qq.com")) // 版權 .license("baobao") // 版權地址 .licenseUrl("http://www.baobao.com") .build(); } }
此時啟動專案,存取ip:埠/doc.html
即可看到knife4j的檔案介面
使用knife4j增強功能的前提是要在yaml設定中開啟增強模式
knife4j: enable: true
swagger只能給整個檔案新增作者,不能針對某個介面單獨新增作者。knife4j中可以有2種方式給介面新增作者:
@ApiSupport(author = "作者名稱")
,這樣整個Controller中的所有介面方法將被指定為該作者@ApiOperationSupport(author = "作者名稱")
,這樣該介面被指定為該作者如果
@ApiSupport
和@ApiOperationSupport
同時指定了作者,那麼方法級別的@ApiOperationSupport
優先順序更高
目前Springfox-Swagger以及Knife4j提供的資源介面包括如下:
資源 | 說明 |
---|---|
/doc.html | Knife4j提供的檔案存取地址 |
/v2/api-docs-ext | Knife4j提供的增強介面地址,自2.0.6 版本後刪除 |
/swagger-resources | Springfox-Swagger提供的分組介面 |
/v2/api-docs | Springfox-Swagger提供的分組範例詳情介面 |
/swagger-ui.html | Springfox-Swagger提供的檔案存取地址 |
/swagger-resources/configuration/ui | Springfox-Swagger提供 |
/swagger-resources/configuration/security | Springfox-Swagger提供 |
swagger中要實現生產環境關閉檔案資源需要在設定類中進行編碼,判斷環境,比較麻煩。knife4j中只需要在對應環境的設定中新增設定即可
spring: profiles: prod # 指定為生產環境 knife4j: production: true # 開啟遮蔽檔案資源
此時只要以prod環境執行,就無法存取到介面檔案
注意:如果正常非生產環境下不遮蔽檔案,那麼引入了springsecurtiy或者自定義攔截器的時候,要排除掉上述表格中的檔案資源,否則在非遮蔽狀態下也將無法存取到檔案資源
介面排序的方式有2種:
針對不同Controller排序:Controller上標註@ApiSupport(order = 序號)
針對同一個Controller中的不同方法排序:同一個Controller不同介面方法上標註@ApiOperationSupport(order = 序號)
通常我們在開發介面時,比如一個新增介面和一個修改介面,修改介面需要傳遞主鍵id、而新增介面則不需要傳遞此屬性,但大部分情況,我們只寫一個Model類,此時在新增介面時顯示主鍵id會顯得很多餘。使用自定義增強註解@ApiOperationSupport
中的ignoreParameters
屬性,可以強制忽略要顯示的引數
我們給User實體新增一個id屬性
然後新增一個新增使用者的介面方法,用表單方式接收引數,但是忽略掉id。在@ApiOperationSupport
中的ignoreParameters
屬性中填寫忽略的屬性名稱即可
@PostMapping("addUser") @ApiOperation("新增使用者") @ApiOperationSupport(ignoreParameters = "id") // 忽略掉User中的id屬性,不顯示在檔案中 public void addUser(User user) { }
注意:
如果是以@RequestBody
形式接收引數,那麼ignoreParameters
中填寫引數名.要忽略的屬性名
即可
@PostMapping("addUser2") @ApiOperation("新增使用者2") @ApiOperationSupport(ignoreParameters = {"user.id", "user.age"}) public void addUser2(@RequestBody User user) { }
注意
AfterScript功能是Knife4j自2.0.6版本開始新增的一項特性功能,在每個介面進行偵錯Tab中,開發者可以根據Knife4j提供的全域性變數,在介面呼叫之前編寫一段JavaScript指令碼,當介面呼叫成功後,Knife4j會執行該指令碼
主要應用場景:針對JWT型別的介面,呼叫登入介面後,每個介面請求時帶上Token引數,此時可以通過該指令碼動態賦值全域性token引數,省去複製貼上的麻煩
Knife4j目前主要提供ke(Knife4j Environment)物件來獲取或者操作全域性物件,主要包含的物件:
我們新增一個登入介面,返回token引數
@PostMapping("login") @ApiOperation("登入") public Map<String, Object> login() { Map<String, Object> result = new HashMap<>(2); result.put("success", true); result.put("token", "1364564646"); return result; }
然後在knife4j檔案中針對這個登入介面編寫AfterScript,取出返回的token,設定到每一個請求的請求頭中
var success=ke.response.data.success; if(success===true){ // 獲取token var token=ke.response.data.token; // 設定當前邏輯分組下的全域性Header ke.global.setHeader("Authorization", "Bearer " + token); }
這樣的效果是,請求login介面成功返回token後,後續偵錯其他所有介面時會自動給請求頭中新增token引數,無需手動新增
Knife4j提供基於UI臨時設定全域性引數功能,例如後臺全域性token引數等.提供該功能主要是方便開發者進行偵錯
目前全域性引數功能主要提供兩種引數型別:query(表單)、header(請求頭)
如果後端Swagger有設定全域性引數,該功能可以無視
在微服務架構下,如果給每個微服務都設定檔案,那麼每個微服務的介面檔案都有自己獨立的存取地址,這樣要一個個開啟每個微服務的檔案非常麻煩。一般我們會採用聚合的辦法,將所有微服務的介面整合到一個檔案中
傳統的整合方法需要在gateway中進行大量設定,十分繁瑣。自2.0.8版本開始,Knife4j 提供了knife4j-aggregation-spring-boot-starter
元件,該元件是一個基於Spring Boot系統的starter,他提供了以下幾種能力:
目前Knife4jAggregation主要提供了四種方式進行OpenAPI檔案的聚合,主要包括:
基於OpenAPI的靜態JSON檔案方式,Disk模式
基於HTTP介面的方式獲取OpenAPI,Cloud模式
基於Eureka註冊中心獲取OpenAPI,Eureka模式
基於Nacos註冊中心獲取OpenAPI,Nacos模式
Disk、Cloud、Eureka、Nacos這四種模式只能使用其中1種,不能混合一起使用(即只能設定這4中模式中的一種屬性,然後將其enable屬性設定為true,其他三種的enable則必須設定為false)
利用knife4j進行檔案聚合的步驟非常簡單:
1.建立一個SpringBoot專案,用於聚合檔案,引入下列依賴
<dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-aggregation-spring-boot-starter</artifactId> <version>2.0.9</version> </dependency>
2.設定需要聚合的檔案的地址
3.存取該聚合檔案的地址,即可存取到被聚合的所有介面檔案
cloud模式原理是,在聚合檔案工程設定每個微服務的http介面資源地址,這樣聚合檔案工程啟動的時候可以存取到每個微服務的http介面檔案資源地址,從而聚合每個微服務的介面檔案
這種方式可以用在沒有註冊中心,每個SpringBoot微服務單獨啟動的場景由於聚合檔案工程需要能存取到每個微服務的http介面檔案資源地址才能做聚合,所以在聚合檔案工程啟動之前要先啟動需要被聚合的每個微服務,並且每個微服務自己要做好swagger檔案的相關設定
為了測試聚合檔案,我們首先複製出一個SpringBoot工程knife4j-app2
作為第2個微服務,其主要設定與knife4j-app1
一樣,只是部分地方作了名稱修改。然後再建立一個聚合檔案工程knife4j-agg-doc
:
在聚合檔案工程knife4j-agg-doc
中引入依賴
<dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-aggregation-spring-boot-starter</artifactId> <version>2.0.9</version> </dependency>
cloud模式中,yaml的設定範例如下:
knife4j: enableAggregation: true cloud: enable: true routes: - name: 使用者體系 uri: 192.168.0.152:8999 location: /v2/api-docs?group=2.X版本 swaggerVersion: 2.0 servicePath: /abbb/ffe routeAuth: enable: true username: test3 password: 66666 routeAuth: enable: true username: test password: 12313
我們在knife4j-agg-doc
的yaml中做如下設定
server: port: 8010 knife4j: enableAggregation: true # 開啟聚合 cloud: enable: true # 開啟cloud模式 routes: - name: 應用1 # 微服務在聚合檔案中的名稱 uri: localhost:8000 # 微服務的http地址 location: /v2/api-docs # 微服務檔案資源路徑 servicePath: /api/app1 # 給每個介面新增路徑字首,作用是拼接出經過nginx和gateway處理前的實際介面url - name: 應用2 uri: localhost:8001 location: /v2/api-docs?group=default servicePath: /api/app2
然後先啟動knife4j-app1
與knife4j-app2
,再啟動knife4j-agg-doc
,存取knife4j-agg-doc
的地址http://localhost:8010/doc.html
即可看到聚合後的檔案
Nacos模式原理是,在聚合檔案工程設定每個微服務的Nacos註冊中心地址和服務名稱,這樣聚合檔案工程啟動的時候可以從Nacos存取到每個微服務的http介面檔案資源地址,從而聚合每個微服務的介面檔案
為了測試Nacos模式,首先在每個微服務中引入nacos相關依賴和設定,並啟動Nacos和微服務,將它們註冊到Nacos中
Nacos模式的可選設定如下
knife4j: enableAggregation: true nacos: enable: true serviceUrl: http://192.168.0.112:8804/nacos/ routeAuth: enable: true username: test password: 12313 routes: - name: 訂單服務 serviceName: service-order groupName: test namespaceId: test clusters: test location: /v2/api-docs?group=default swaggerVersion: 2.0 servicePath: /order routeAuth: enable: true username: test password: 12313
我們在聚合檔案工程knife4j-agg-doc
的yaml中做如下設定
server: port: 8010 knife4j: enableAggregation: true nacos: enable: true # 開啟Nacos模式 serviceUrl: http://localhost:8848/nacos # Nacos註冊中心地址 routes: - name: 應用1 # 微服務在聚合檔案中的名稱 serviceName: APP1 # 微服務在Nacos註冊中心的名稱 location: /v2/api-docs # 微服務檔案資源路徑 servicePath: /api/app1 # 給每個介面新增路徑字首,作用是拼接出經過nginx和gateway處理前的實際介面url - name: 應用2 serviceName: APP2 location: /v2/api-docs servicePath: /api/app2
啟動聚合檔案工程,存取http://localhost:8010/doc.html
檢視聚合檔案
到此這篇關於swagger檔案增強工具knife4j使用詳解的文章就介紹到這了,更多相關swagger檔案增強工具knife4j內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45