今天技術總監說:小明,咱們本次3.0改造,使用swagger2.0做爲先後端分離的接口規範,它能夠一鍵生成先後端的API,一勞永逸……小明:???html
Spring Boot 框架是目前很是流行的微服務框架,咱們不少狀況下使用它來提供 Rest API,而對於 Rest API 來講很重要的一部份內容就是文檔,Swagger 爲咱們提供了一套經過代碼和註解自動生成文檔的方法,這一點對於保證 API 文檔的及時性將有很大的幫助。本文將使用 Swagger 2 規範的 Springfox 實現來了解如何在 Spring Boot 項目中使用 Swagger,主要包含了如何使用 Swagger 自動生成文檔、使用 Swagger 文檔以及 Swagger 相關的一些高級配置和註解。前端
Swagger 是一套基於 OpenAPI 規範構建的開源工具,能夠幫助咱們設計、構建、記錄以及使用 Rest API。Swagger 主要包含了如下三個部分:java
當下不少公司都採起先後端分離的開發模式,前端和後端的工做由不一樣的工程師完成。在這種開發模式下,維持一份及時更新且完整的 Rest API 文檔將會極大的提升咱們的工做效率。傳統意義上的文檔都是後端開發人員手動編寫的,相信你們也都知道這種方式很難保證文檔的及時性,這種文檔長此以往也就會失去其參考意義,反而還會加大咱們的溝通成本。而 Swagger 給咱們提供了一個全新的維護 API 文檔的方式,下面咱們就來了解一下它的優勢:git
Swagger UI 呈現出來的是一份可交互式的 API 文檔,咱們能夠直接在文檔頁面嘗試 API 的調用,省去了準備複雜的調用參數的過程。程序員
還能夠將文檔規範導入相關的工具(例如 SoapUI), 這些工具將會爲咱們自動地建立自動化測試。github
以上這些優勢足以說明咱們爲何要使用 Swagger 了,您是否已經對 Swagger 產生了濃厚的興趣了呢?下面咱們就將一步一步地在 Spring Boot 項目中集成和使用 Swagger,讓咱們從準備一個 Spring Boot 的 Web 項目開始吧。web
在這一步咱們將準備一個基礎的 Spring Boot 的 Web 項目,而且提供後面所須要的全部 API。spring
您能夠經過 Spring Initializr 頁面生成一個空的 Spring Boot 項目,固然也能夠下載 springboot-pom.xml 文件,而後使用 Maven 構建一個 Spring Boot 項目。項目建立完成後,爲了方便後面代碼的編寫您能夠將其導入到您喜歡的 IDE 中,我這裏選擇了 Intelli IDEA 打開。apache
因爲建立的是一個 Web 項目,因此咱們須要依賴 Spring Boot 的 Web 組件,只須要在 pom.xml 增長以下內容便可:後端
清單 1. 添加 Web 依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
清單 2. UserController.java 代碼
@RestController @RequestMapping("/user") public class UserController { @PostMapping("/add") public boolean addUser(@RequestBody User user) { return false; } @GetMapping("/find/{id}") public User findById(@PathVariable("id") int id) { return new User(); } @PutMapping("/update") public boolean update(@RequestBody User user) { return true; } @DeleteMapping("/delete/{id}") public boolean delete(@PathVariable("id") int id) { return true; } }
通過上面的步驟,咱們已經擁有了五個接口,分別是:
下面咱們將經過集成 Swagger2,而後爲這 5 個 Rest API 自動生成接口文檔。
首先要作的天然是添加 Swagger2 所須要的依賴包:
清單 3. 添加 Swagger 依賴
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency>
Springfox 提供了一個 Docket 對象,讓咱們能夠靈活的配置 Swagger 的各項屬性。下面咱們新建一個 cn.itweknow.sbswagger.conf.SwaggerConfig.java 類,並增長以下內容:
清單 4. Swagger Java 配置
@Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.any()) .paths(PathSelectors.any()) .build(); } }
注意: @Configuration 是告訴 Spring Boot 須要加載這個配置類,@EnableSwagger2 是啓用 Swagger2,若是沒加的話天然而然也就看不到後面的驗證效果了。
至此,咱們已經成功的在 Spring Boot 項目中集成了 Swagger2,啓動項目後,咱們能夠經過在瀏覽器中訪問 http://localhost:8080/ v2/api-docs 來驗證,您會發現返回的結果是一段 JSON 串,可讀性很是差。幸運的是 Swagger2 爲咱們提供了可視化的交互界面 SwaggerUI,下面咱們就一塊兒來試試吧。
和以前同樣,集成的第一步就是添加相關依賴,在 pom.xml 中添加以下內容便可:
清單 5. 添加 Swagger UI 依賴
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency>
其實就只須要添加一下依賴就能夠了,咱們從新啓動一下項目,而後在瀏覽器中訪問 http://localhost:8080/swagger-ui.html 就能夠看到以下的效果了:
圖 1. Swagger UI
點擊查看大圖
能夠看到雖然可讀性好了一些,但對接口的表述還不是那麼的清楚,接下來咱們就經過一些高級配置,讓這份文檔變的更加的易讀。
清單 6. 給 Controller 添加描述信息
@Api(tags = "用戶相關接口", description = "提供用戶相關的 Rest API") public class UserController
清單 7. 給接口添加描述信息
@ApiOperation("新增用戶接口") @PostMapping("/add") public boolean addUser(@RequestBody User user) { return false; }
清單 8. 給實體類添加描述信息
@ApiModel("用戶實體") public class User { @ApiModelProperty("用戶 id") private int id; }
清單 9. 配置文檔信息
@Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.any()) .paths(PathSelectors.any()) .build() .apiInfo(apiInfo()); } private ApiInfo apiInfo() { return new ApiInfo( "Spring Boot 項目集成 Swagger 實例文檔", "個人博客網站:https://itweknow.cn,歡迎你們訪問。", "API V1.0", "Terms of service", new Contact("名字想好沒", "https://itweknow.cn", "gancy.programmer@gmail.com"), "Apache", "http://www.apache.org/", Collections.emptyList()); }
通過上面的步驟,咱們的文檔將會變成下圖的樣子,如今看起來就清楚不少了。
圖 2. 補全信息後的 Swagger 文檔界面
點擊查看大圖
有些時候咱們並非但願全部的 Rest API 都呈如今文檔上,這種狀況下 Swagger2 提供給咱們了兩種方式配置,一種是基於 @ApiIgnore 註解,另外一種是在 Docket 上增長篩選。
若是想在文檔中屏蔽掉刪除用戶的接口(user/delete),那麼只須要在刪除用戶的方法上加上 @ApiIgnore 便可。
清單 10. @ApiIgnore 使用實例
@ApiIgnore public boolean delete(@PathVariable("id") int id)
apis():這種方式咱們能夠經過指定包名的方式,讓 Swagger 只去某些包下面掃描。
paths():這種方式能夠經過篩選 API 的 url 來進行過濾。
在集成 Swagger2 的章節中咱們這兩個方法指定的都是掃描全部,沒有指定任何過濾條件。若是咱們在咱們修改以前定義的 Docket 對象的 apis() 方法和 paths() 方法爲下面的內容,那麼接口文檔將只會展現 /user/add 和 /user/find/{id} 兩個接口。
清單 11. 使用 Docket 配置接口篩選
.apis(RequestHandlerSelectors.basePackage("cn.itweknow.sbswagger.controller")) .paths(Predicates.or(PathSelectors.ant("/user/add"), PathSelectors.ant("/user/find/*")))
圖 3. 通過篩選事後的 Swagger 文檔界面
點擊查看大圖
Swagger 容許咱們經過 Docket 的 globalResponseMessage() 方法全局覆蓋 HTTP 方法的響應消息,可是首先咱們得經過 Docket 的 useDefaultResponseMessages 方法告訴 Swagger 不使用默認的 HTTP 響應消息,假設咱們如今須要覆蓋全部 GET 方法的 500 和 403 錯誤的響應消息,咱們只須要在 SwaggerConfig.java 類中的 Docket Bean 下添加以下內容:
清單 12. 自定義響應消息
.useDefaultResponseMessages(false) .globalResponseMessage(RequestMethod.GET, newArrayList( new ResponseMessageBuilder() .code(500) .message("服務器發生異常") .responseModel(new ModelRef("Error")) .build(), new ResponseMessageBuilder() .code(403) .message("資源不可用") .build() ));
添加如上面的代碼後,以下圖所示,您會發如今 SwaggerUI 頁面展現的全部 GET 類型請求的 403 以及 500 錯誤的響應消息都變成了咱們自定義的內容。
圖 4. 自定義響應消息
點擊查看大圖
SwaggerUI 會以列表的方式展現全部掃描到的接口,初始狀態是收縮的,咱們只須要點擊展開就好,並且會在左邊標識接口的請求方式(GET、POST、PUT、DELETE 等等)。
圖 5. Swagger 接口列表界面
點擊查看大圖
以下圖所示,點擊接口展開後頁面右上角的 Try it out 按鈕後,頁面會變成如圖所示:
圖 6. 接口詳情界面
點擊查看大圖
SwaggerUI 會給咱們自動填充請求參數的數據結構,咱們須要作的只是點擊 Execute 便可發起調用
圖 7. 接口調用界面
點擊查看大圖
以下圖所示,SwaggerUI 會經過咱們在實體上使用的 @ApiModel 註解以及@ApiModelProperty 註解來自動補充實體以及其屬性的描述和備註。
圖 8. 實體界面
點擊查看大圖
在本章節中我將給出一些 Swagger 中經常使用的註解以及其經常使用的屬性,並對其一一解釋,方便您查看。
@Api: 可設置對控制器的描述。
表 1. @Api 主要屬性
|註解屬性 |類型 |描述|
| ------|--------|
|tags |String[] |控制器標籤。|
|description |String |控制器描述(該字段被申明爲過時)。|
表 2. @ApiOperation 主要屬性
|註解屬性 |類型 |描述|
| ------|--------|
|value| String| 接口說明。|
|notes |String |接口發佈說明。|
|tags |Stirng[]| 標籤。|
|response |Class<?>| 接口返回類型。|
|httpMethod| String| 接口請求方式。|
@ApiIgnore: Swagger 文檔不會顯示擁有該註解的接口。
@ApiImplicitParams: 用於描述接口的非對象參數集。
@ApiImplicitParam: 用於描述接口的非對象參數,通常與 @ApiImplicitParams 組合使用。
表 3. @ApiImplicitParam 主要屬性
註解屬性 | 描述 |
---|---|
paramType | 查詢參數類型,實際上就是參數放在那裏。取值:
|
dataType | 參數的數據類型。取值:
|
name | 參數名字。 |
value | 參數意義的描述。 |
required | 是否必填。取值:
|
表 4. @ApiModelProperty 主要屬性
|註解屬性| 類型| 描述|
|-------|-------|------|
|value |String| 字段說明。|
|name |String |重寫字段名稱。|
|dataType| Stirng| 重寫字段類型。|
|required |boolean| 是否必填。|
|example |Stirng| 舉例說明。|
|hidden |boolean |是否在文檔中隱藏該字段。|
|allowEmptyValue| boolean |是否容許爲空。|
|allowableValues| String |該字段容許的值,當咱們 API 的某個參數爲枚舉類型時,使用這個屬性就能夠清楚地告訴 API 使用者該參數所能容許傳入的值。|
在本教程中,咱們學會了如何使用 Swagger 2 來生成 Spring Boot REST API 的文檔。咱們還研究瞭如何過濾 API、自定義 HTTP 響應消息以及如何使用 SwaggerUI 直接調用咱們的 API。您能夠在 Github 上找到本教程的完整實現,這是一個基於 IntelliJ IDEA 的項目,所以它應該很容易導入和運行,固然若是您想對本教程作補充的話歡迎發郵件給我 (mynamecoder@163.com) 或者直接在 GitHub 上提交 Pull Request。
Spring 指南
Spring 主頁
Spring Boot 參考指南
Swagger 主頁
本文源碼地址