我們知道在項目開發階段,接口文檔基本上是必備產物了,一般由后端開發人員提供,作為和前端人員進行前后端接口聯調的橋梁,或者與別的項目模塊進行交互提供指導等等,接口文檔的准確性,實時性,詳細與否等,都會極大的影響前面的操作。那么如何才能優雅的生成接口文檔呢?
這里,我首先給出如何生成接口文檔的小demo地址,在下面介紹中,有不懂的,可以參考項目注釋來看。
https://github.com/YSOcean/swagger-bootstrap-ui-demo.git
1、接口文檔的痛點
①、准確性
傳統的接口文檔產出,基本上是由后端人員進行手工編寫,在編寫文檔過程中,很可能會由於人為的粗心大意,造成接口文檔某個字段,或者某個接口名寫錯,那么這些粗心導致的錯誤就會影響后續的聯調等操作。
所以接口文檔和實際代碼的一致性是比較重要的。
②、實時性
在項目開發過程中,當后端人員提供了一份接口文檔,並且與前端人員聯調也通過了,但是由於需求變更,導致后端接口發生了變化,而后端人員有可能懶,又沒有實時的去更新接口文檔,那么前端人員就無法根據最新的接口文檔進行修改,從而無法有效的完成整個項目的需求變更。
所以接口文檔的實時性也是很重要的。
③、詳細性
在進行接口文檔編寫時,基本上都會有一個標准,包括接口名、方法類型、入參、入參類型,返回值,返回值的各種情況說明等等。一般公司都會通過接口文檔規范來強制大家按照要求編寫,但是理想很美好,現實很殘酷。隨着時間推移,項目迭代次數過多,或者項目周期趕等等因素,大家很難能夠完全按照規范來編寫接口文檔。
由於接口文檔的不夠規范,描述不夠詳細,對於接口文檔的需求方會造成困擾。
以上便是關於接口文檔的一些痛點,可能你就會開始想,優雅的接口文檔,應該滿足如下特性:
一、自動生成滿足接口規范的文檔
二、能夠跟隨代碼實時更新
那么應該怎么辦呢?
2、Swagger
程序員是萬能的,基本上有痛點,就會有解決方案。於是 Swagger 產生了。
簡單來說,Swagger 是一套規范,只需要按照它的規范去定義接口以及接口相關信息,在通過Swagger衍生出來的一系列項目和工具,就可以做到生成各種格式的接口文檔,生成多種語言的客戶端和服務端的代碼,以及在線接口調試頁面等等。這樣,如果按照新的開發模式,在開發新版本或者迭代版本的時候,只需要更新Swagger描述文件,就可以自動生成接口文檔和客戶端服務端代碼,做到調用端代碼、服務端代碼以及接口文檔的一致性。
這里,我們不對 Swagger 進行過多的描述,需要了解更多的,可以參考下面的官方文檔。
Swagger 官方網站:https://swagger.io/
3、普通版工具-springfox-swagger-ui
多的不說,我們直接進入正題,如何在項目中引入swagger呢?
①、引入jar包
<!-- swagger2 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${swagger.version}</version> </dependency> <!--swagger2-UI--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>${swagger.version}</version> </dependency>
PS:這里的版本號可以參考源碼pom.xml文件。或者到下面的Maven倉庫中選取最新的版本。
一、swagger2倉庫地址:https://mvnrepository.com/artifact/io.springfox/springfox-swagger2
二、springfox-swagger-ui倉庫地址:https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui
②、編寫配置文件

1 package com.ys.swaggerbootstrapuidemo.common; 2 3 import org.springframework.beans.factory.annotation.Value; 4 import org.springframework.context.annotation.Bean; 5 import org.springframework.context.annotation.Configuration; 6 import springfox.documentation.builders.ApiInfoBuilder; 7 import springfox.documentation.builders.PathSelectors; 8 import springfox.documentation.builders.RequestHandlerSelectors; 9 import springfox.documentation.service.ApiInfo; 10 import springfox.documentation.service.Contact; 11 import springfox.documentation.spi.DocumentationType; 12 import springfox.documentation.spring.web.plugins.Docket; 13 import springfox.documentation.swagger2.annotations.EnableSwagger2; 14 15 /** 16 * @Author: yuShuai 17 * @Description: Swagger2的接口配置 18 * @Date: 2019/10/8 13:41 19 * @params: 20 * @return: 21 */ 22 @Configuration 23 @EnableSwagger2 24 public class SwaggerConfig { 25 26 27 @Value("${config.swaggerConfig.isShow}") 28 private Boolean isShow; 29 30 31 @Bean 32 public Docket createUserRestApi() { 33 return new Docket(DocumentationType.SWAGGER_2) 34 .enable(isShow) 35 // 用來創建該API的基本信息,展示在文檔的頁面中(自定義展示的信息) 36 .apiInfo(apiInfo()) 37 .groupName("用戶管理API") 38 // 通過select()函數返回一個ApiSelectorBuilder實例,用來控制哪些接口暴露給Swagger來展現 39 .select() 40 .apis(RequestHandlerSelectors.basePackage("com.ys.swaggerbootstrapuidemo.controller.user")) 41 // 掃描所有有注解的api 42 //.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) 43 // 掃描指定包中的swagger注解 44 //.apis(RequestHandlerSelectors.basePackage("com.kxjl.belleps.api")) 45 // 掃描所有 .apis(RequestHandlerSelectors.any()) 46 // 對所有路徑進行監控 47 .paths(PathSelectors.any()) 48 .build(); 49 } 50 51 @Bean 52 public Docket createRoleRestApi() { 53 return new Docket(DocumentationType.SWAGGER_2) 54 .enable(isShow) 55 // 用來創建該API的基本信息,展示在文檔的頁面中(自定義展示的信息) 56 .apiInfo(apiInfo()) 57 .groupName("角色管理API") 58 // 通過select()函數返回一個ApiSelectorBuilder實例,用來控制哪些接口暴露給Swagger來展現 59 .select() 60 .apis(RequestHandlerSelectors.basePackage("com.ys.swaggerbootstrapuidemo.controller.role")) 61 // 掃描所有有注解的api 62 //.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) 63 // 掃描指定包中的swagger注解 64 //.apis(RequestHandlerSelectors.basePackage("com.kxjl.belleps.api")) 65 // 掃描所有 .apis(RequestHandlerSelectors.any()) 66 // 對所有路徑進行監控 67 .paths(PathSelectors.any()) 68 .build(); 69 } 70 71 /** 72 * 添加摘要信息 73 */ 74 private ApiInfo apiInfo() { 75 // 用ApiInfoBuilder進行定制 76 return new ApiInfoBuilder() 77 // 設置標題 78 .title("標題:Swagger測試_接口文檔") 79 // 描述 80 .description("描述:Swagger測試相關接口信息") 81 // 作者信息 82 .contact(new Contact("ShuaiYu", "https://www.cnblogs.com/ysocean/", "1827165732@163.com")) 83 // 版本 84 .version("版本號:" + "1.0") 85 .build(); 86 } 87 }
PS:相關配置的意思在代碼中都有標注,這里需要注意以下兩點:
一、由於swagger是用於生成API文檔,那么在生成環境中是不能讓別人能夠訪問的,需要需要配置 new Docket(DocumentationType.SWAGGER_2).enable(isShow)。
對於isShow屬性,我們可以在application.yml配置文件進行相關設定,true表示顯示,false不是不展示。
applicaion.yml 文件配置:
config: swaggerConfig: #是否展示swagger,true表示展示。生產環境中需要置為false,避免暴露接口 isShow: true
二、配置文件中,我配置了groupName()屬性,這是為了在微服務模式下,模塊太多,便於分類展示(具體可以看下面的截圖展示)。只保留一個Docket也是可以的。
③、訪問地址
http://${host}:${port}/項目訪問地址名稱/swagger-ui.html
PS:這里的“項目訪問地址名稱”是你在配置文件配置了就寫,沒有配置,這里則沒有。比如,本項目的配置文件為:
server: port: 8070 servlet: context-path: /swaggerTest
那么訪問接口文檔的路徑為:
http://localhost:8070/swaggerTest/swagger-ui.html
④、截圖展示
一、初始界面
二、 配置了多個groupName()屬性,展示如下
三、接口詳情
具體可以直接運行最前文的 github 項目,查看即可。
4、增強版工具-swagger-bootstrap-ui
swagger-bootstrap-ui 是 springfox-swagger
的增強UI實現,為Java開發者在使用Swagger的時候,能擁有一份簡潔、強大的接口文檔體驗
這個項目的地址:https://github.com/xiaoymin/swagger-bootstrap-ui
作者對於這個項目的描述已經很清楚了。
①、用法
在用法上,和前面普通版工具一樣,只需要將jar包 springfox-swagger-ui 替換成 swagger-bootstrap-ui 即可。
②、訪問路徑
http://${host}:${port}/項目訪問地址名稱/doc.html
③、截圖展示
④、生成接口文檔 md
5、總結
大家在使用過程中,直接用增強版工具 swagger-bootstrap-ui 就可以了。再次列一下我寫的一個 demo 路徑:
https://github.com/YSOcean/swagger-bootstrap-ui-demo.git
這是一個 Springboot 項目,大家可以下載,直接運行,有不懂的歡迎留言評論。
本文已獨家授權給腳本之家(jb51net)公眾號發布!!!