springboot快速集成swagger

今天技術總監說:小明,我們本次3.0改造,使用swagger2.0作為前后端分離的接口規范,它可以一鍵生成前后端的API,一勞永逸……小明:???

Spring Boot 框架是目前非常流行的微服務框架,我們很多情況下使用它來提供 Rest API,而對于 Rest API 來說很重要的一部分內容就是文檔,Swagger 為我們提供了一套通過代碼和注解自動生成文檔的方法,這一點對于保證 API 文檔的及時性將有很大的幫助。本文將使用 Swagger 2 規范的 Springfox 實現來了解如何在 Spring Boot 項目中使用 Swagger,主要包含了如何使用 Swagger 自動生成文檔、使用 Swagger 文檔以及 Swagger 相關的一些高級配置和注解。

Swagger 簡介

Swagger 是一套基于 OpenAPI 規范構建的開源工具,可以幫助我們設計、構建、記錄以及使用 Rest API。Swagger 主要包含了以下三個部分:

  1. Swagger Editor:基于瀏覽器的編輯器,我們可以使用它編寫我們 OpenAPI 規范。
  2. Swagger UI:它會將我們編寫的 OpenAPI 規范呈現為交互式的 API 文檔,后文我將使用瀏覽器來查看并且操作我們的 Rest API。
  3. Swagger Codegen:它可以通過為 OpenAPI(以前稱為 Swagger)規范定義的任何 API 生成服務器存根和客戶端 SDK 來簡化構建過程。

為什么要使用 Swagger

當下很多公司都采取前后端分離的開發模式,前端和后端的工作由不同的工程師完成。在這種開發模式下,維持一份及時更新且完整的 Rest API 文檔將會極大的提高我們的工作效率。傳統意義上的文檔都是后端開發人員手動編寫的,相信大家也都知道這種方式很難保證文檔的及時性,這種文檔久而久之也就會失去其參考意義,反而還會加大我們的溝通成本。而 Swagger 給我們提供了一個全新的維護 API 文檔的方式,下面我們就來了解一下它的優點:

  1. 代碼變,文檔變。只需要少量的注解,Swagger 就可以根據代碼自動生成 API 文檔,很好的保證了文檔的時效性。
  2. 跨語言性,支持 40 多種語言。
  3. Swagger UI 呈現出來的是一份可交互式的 API 文檔,我們可以直接在文檔頁面嘗試 API 的調用,省去了準備復雜的調用參數的過程。

  4. 還可以將文檔規范導入相關的工具(例如 SoapUI), 這些工具將會為我們自動地創建自動化測試。

以上這些優點足以說明我們為什么要使用 Swagger 了,您是否已經對 Swagger 產生了濃厚的興趣了呢?下面我們就將一步一步地在 Spring Boot 項目中集成和使用 Swagger,讓我們從準備一個 Spring Boot 的 Web 項目開始吧。

準備 Spring Boot Web 項目

在這一步我們將準備一個基礎的 Spring Boot 的 Web 項目,并且提供后面所需要的所有 API。

創建一個空的 Spring Boot 項目

您可以通過 Spring Initializr 頁面生成一個空的 Spring Boot 項目,當然也可以下載 springboot-pom.xml 文件,然后使用 Maven 構建一個 Spring Boot 項目。項目創建完成后,為了方便后面代碼的編寫您可以將其導入到您喜歡的 IDE 中,我這里選擇了 Intelli IDEA 打開。

添加依賴

由于創建的是一個 Web 項目,所以我們需要依賴 Spring Boot 的 Web 組件,只需要在 pom.xml 增加如下內容即可:

清單 1. 添加 Web 依賴

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

編寫接口

  1. 首先我們創建三個包:cn.itweknow.sbswagger.controller、cn.itweknow.sbswagger.testcontroller 以及 cn.itweknow.sbswagger.model。
  2. 在 controller 包下新建 UserController.java 類,在 testcontroller 包下新建 TestController.java 類,在 model 包下新建 User.java 類。
  3. UserController 提供用戶的增、刪、改、查四個接口,TestContrller 提供一個測試接口,這里粘上 UserController.java 的代碼,其余代碼可以查看源碼。

清單 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

經過上面的步驟,我們已經擁有了五個接口,分別是:

  1. /user/add:新增用戶。
  2. /user/find/{id}:根據 id 查詢用戶。
  3. /user/update:更新用戶。
  4. /user/delete/{id}:根據 id 刪除用戶。
  5. /test/test:測試接口。

下面我們將通過集成 Swagger2,然后為這 5 個 Rest API 自動生成接口文檔。

添加依賴

首先要做的自然是添加 Swagger2 所需要的依賴包:

清單 3. 添加 Swagger 依賴

<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version>
</dependency>

Java 配置

Springfox 提供了一個 Docket 對象,讓我們可以靈活的配置 Swagger 的各項屬性。下面我們新建一個 cn.itweknow.sbswagger.conf.SwaggerConfig.java 類,并增加如下內容:

清單 4. Swagger Java 配置

@Configuration
@EnableSwagger2
public class SwaggerConfig {@Beanpublic 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,下面我們就一起來試試吧。

集成 Swagger UI

添加依賴

和之前一樣,集成的第一步就是添加相關依賴,在 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

點擊查看大圖

可以看到雖然可讀性好了一些,但對接口的表述還不是那么的清楚,接下來我們就通過一些高級配置,讓這份文檔變的更加的易讀。

高級配置

文檔相關描述配置

  1. 通過在控制器類上增加@Api 注解,可以給控制器增加描述和標簽信息。

清單 6. 給 Controller 添加描述信息

@Api(tags = "用戶相關接口", description = "提供用戶相關的 Rest API")
public class UserController
  1. 通過在接口方法上增加 @ApiOperation 注解來展開對接口的描述,當然這個注解還可以指定很多內容,我們在下面的相關注解說明章節中詳細解釋。

清單 7. 給接口添加描述信息

@ApiOperation("新增用戶接口")
@PostMapping("/add")
public boolean addUser(@RequestBody User user) {return false;
}
  1. 實體描述,我們可以通過 @ApiModel 和 @ApiModelProperty 注解來對我們 API 中所涉及到的對象做描述。

清單 8. 給實體類添加描述信息

@ApiModel("用戶實體")
public class User {@ApiModelProperty("用戶 id")
private int id;
}
  1. 文檔信息配置,Swagger 還支持設置一些文檔的版本號、聯系人郵箱、網站、版權、開源協議等等信息,但與上面幾條不同的是這些信息不是通過注解配置,而是通過創建一個 ApiInfo 對象,并且使用 Docket.appInfo() 方法來設置,我們在 SwaggerConfig.java 類中新增如下內容即可。

清單 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 上增加篩選。

  1. @ApiIgnore 注解。

如果想在文檔中屏蔽掉刪除用戶的接口(user/delete),那么只需要在刪除用戶的方法上加上 @ApiIgnore 即可。

清單 10. @ApiIgnore 使用實例

@ApiIgnore
public boolean delete(@PathVariable("id") int id)
  1. 在 Docket 上增加篩選。Docket 類提供了 apis() 和 paths()兩 個方法來幫助我們在不同級別上過濾接口:
  • 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. 自定義響應消息

點擊查看大圖

Swagger UI 的使用

接口查看

SwaggerUI 會以列表的方式展示所有掃描到的接口,初始狀態是收縮的,我們只需要點擊展開就好,而且會在左邊標識接口的請求方式(GET、POST、PUT、DELETE 等等)。

圖 5. Swagger 接口列表界面

點擊查看大圖

接口調用

如下圖所示,點擊接口展開后頁面右上角的 Try it out 按鈕后,頁面會變成如圖所示:

圖 6. 接口詳情界面

點擊查看大圖

SwaggerUI 會給我們自動填充請求參數的數據結構,我們需要做的只是點擊 Execute 即可發起調用

圖 7. 接口調用界面

點擊查看大圖

Model

如下圖所示,SwaggerUI 會通過我們在實體上使用的 @ApiModel 注解以及@ApiModelProperty 注解來自動補充實體以及其屬性的描述和備注。

圖 8. 實體界面

點擊查看大圖

相關注解說明

在本章節中我將給出一些 Swagger 中常用的注解以及其常用的屬性,并對其一一解釋,方便您查看。

Controller 相關注解

@Api: 可設置對控制器的描述。

表 1. @Api 主要屬性
|注解屬性 |類型 |描述|
| ------|--------|
|tags |String[] |控制器標簽。|
|description |String |控制器描述(該字段被申明為過期)。|

接口相關注解

  1. @ApiOperation: 可設置對接口的描述。

表 2. @ApiOperation 主要屬性
|注解屬性 |類型 |描述|
| ------|--------|
|value| String| 接口說明。|
|notes |String |接口發布說明。|
|tags |Stirng[]| 標簽。|
|response |Class<?>| 接口返回類型。|
|httpMethod| String| 接口請求方式。|

  1. @ApiIgnore: Swagger 文檔不會顯示擁有該注解的接口。

  2. @ApiImplicitParams: 用于描述接口的非對象參數集。

  3. @ApiImplicitParam: 用于描述接口的非對象參數,一般與 @ApiImplicitParams 組合使用。

表 3. @ApiImplicitParam 主要屬性






























注解屬性描述
paramType 查詢參數類型,實際上就是參數放在那里。取值:


  • path:以地址的形式提交數據,根據 id 查詢用戶的接口就是這種形式傳參。
  • query:Query string 的方式傳參。
  • header:以流的形式提交。
  • form:以 Form 表單的形式提交。

dataType 參數的數據類型。取值:


  • Long
  • String

name 參數名字。
value 參數意義的描述。
required 是否必填。取值:


  • true:必填參數。
  • false:非必填參數。

Model 相關注解

  1. @ApiModel: 可設置接口相關實體的描述。
  2. @ApiModelProperty: 可設置實體屬性的相關描述。

表 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 主頁
本文源碼地址

歡迎關注微信公眾號,獲取更多資源

程序員小明

轉載于:https://www.cnblogs.com/coderxx/p/10953726.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248839.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248839.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248839.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php curl處理get和post請求

CURL 是一個利用URL語法規定來傳輸文件和數據的工具&#xff0c;支持很多協議&#xff0c;如HTTP、FTP、TELNET等。最爽的是&#xff0c;PHP也支持 CURL 庫。使用PHP的CURL 庫可以簡單和有效地去抓網頁。你只需要運行一個腳本&#xff0c;然后分析一下你所抓取的網頁&#xff0…

【Web】JavaWeb項目為什么我們要放棄jsp?為什么要前后端解耦?為什么要前后端分離?2.0版,為分布式架構打基礎。 - CSDN博客

前戲 前后端分離已成為互聯網項目開發的業界標準使用方式&#xff0c;通過nginxtomcat的方式&#xff08;也可以中間加一個nodejs&#xff09;有效的進行解耦&#xff0c; 并且前后端分離會為以后的大型分布式架構、彈性計算架構、微服務架構、多端化服務&#xff08;多種客戶…

MongoDB升級導致啟動失敗

起因 最近項目使用MongoDB,但是作為一個技術菜鳥&#xff0c;NoSQL數據庫我還真不會用&#xff0c;于是我就在自己的阿里云服務器上安裝了一個MongoDB4.0.9。 現象 但是當我使用yum -y update升級以后&#xff0c;MongoDB無法啟動了&#xff0c;即使重裝刪除了MongDB的文件了還…

測者的測試技術手冊:揭開java method的一個秘密--巨型函數

揭開java method的一個秘密&#xff1a;巨型函數 相信&#xff0c;很多人都不知道Java的Method的上限為64K。本文將超過這個上限的函數叫做巨型函數。 巨型函數的問題 1、如果代碼超過了這個限制&#xff0c;Java編譯器就報"Code too large to complier"的錯誤。 2、…

前端攻略系列(二) - 前端各種面試題

幸運且光榮的被老大安排了一個任務 - “去整理些前端面試題”。年前確實不是招人的好時候&#xff0c;所以我們前端團隊經過了超負荷的運轉&#xff0c;終于堅持過了春節。春節以后就開始招人啦&#xff0c;這套題考察的目標就是基礎基礎再基礎&#xff0c;嘿嘿。 事先聲明&…

html 初識

一、web請求流程模擬 python編寫的簡易服務器應用程序 import socketserversocket.socket() ip_port (127.0.0.1,8080) server.bind(ip_port) server.listen()while 1:conn, addr server.accept()from_browser_msgconn.recv(1024)print(from_browser_msg)conn.send(bHTTP/1.1 …

Iframe的那些事

在web開發中&#xff0c;經常會用到iframe&#xff0c;難免會碰到需要在父窗口中使用iframe中的元素、或者在iframe框架中使用父窗口的元素 js 在父窗口中獲取iframe中的元素 1、 格式&#xff1a;window.frames["iframe的name值"].document.getElementByIdx_x(…

異常處理try...catch...throw

C 引入了異常處理機制。其基本思想是&#xff1a;函數 A 在執行過程中發現異常時可以不加處理&#xff0c;而只是“拋出一個異常”給 A 的調用者&#xff0c;假定為函數 B。 拋出異常而不加處理會導致函數 A 立即中止&#xff0c;在這種情況下&#xff0c;函數 B 可以選擇捕獲 …

Makefile 中:= ?= += =的區別

是最基本的賦值: 是覆蓋之前的值? 是如果沒有被賦值過就賦予等號后面的值 是添加等號后面的值轉載于:https://www.cnblogs.com/mingyunrangwozoudaoxianzai/p/10118039.html

原生JS寫Ajax的請求函數

本文主要介紹了如何通過原生JavaScript封裝ajax請求&#xff0c;文中給出了具體的實現代碼和詳細的解釋&#xff0c;希望對你有所幫助。 一、JS原生Ajax ajax&#xff1a;一種請求數據的方式&#xff0c;不需要刷新整個頁面&#xff1b; ajax的技術核心是 XMLHttpRequest 對象&…

軟件工程--第十三周學習進度

第十三周代碼量258 所花時間 6h博客量 2篇了解到的知識點 在尋找“水王”程序編寫時&#xff0c;學習了一種新的設計思想&#xff0c;兩兩刪除法&#xff0c;最后剩下的就是水王。這種設計思想&#xff0c;感覺可以用到多種編程&#xff0c;感覺很有意思。轉載于:https://www.c…

如何使用 tf object detection

# 如何使用 tf object detectionhttps://juejin.i m/entry/5a7976166fb9a06335319080https://towardsdatascience.com/how-to-train-your-own-object-detector-with-tensorflows-object-detector-api-bec72ecfe1d9https://towardsdatascience.com/building-a-toy-detector-with…

WEB文件上傳之JQuery ajaxfileupload插件使用(二)

1.JQuery ajaxfileupload插件使用準備 下載地址&#xff1a; http://www.phpletter.com/DOWNLOAD/ 2.原理分析 ajaxfileupload也是利用iframe實現無刷新異步提交&#xff0c;與我的上一篇文章&#xff08;WEB文件上傳之apache common upload使用&#xff08;一&#xff09;&…

Navicat安裝激活

有條件的同學麻煩不要使用下面的激活步驟&#xff0c;僅供個人學習使用 。。。。。。 。。。。。。 。。。。。。 。。。。。。 一、去官網下載最新Navicat軟件https://www.navicat.com.cn/download/navicat-premium 二、去下載激活腳本https://github.com/DoubleLabyrinth/nav…

WEB文件上傳之apache common upload使用(一)

文件上傳一個經常用到的功能&#xff0c;它有許多中實現的方案。 頁面表單 RFC1897規范 http協議上傳 頁面控件(flash/html5/activeX/applet) RFC1897規范 http協議上傳 頁面控件(flash/html5/activeX/applet) 自定義數據規范 http協議上傳 頁面控件(flash/html5/act…

前端CSS學習筆記

一 CSS介紹 層疊樣式表(英文全稱&#xff1a;Cascading Style Sheets)是一種用來表現HTML&#xff08;超文本標記語言&#xff09;或XML&#xff08;標準通用標記語言的一個子集&#xff09;等文件樣式的計算機語言。CSS不僅可以靜態地修飾網頁&#xff0c;還可以配合各種腳本語…

自律以自救

在一次邏輯思維的跨年晚會上&#xff0c;羅胖曾以「帝王」來形容活在當下移動互聯網世界的人們。一個手機 App 可以讓你足不出戶&#xff0c;享受上百名廚師團隊的服務&#xff0c;中飯想吃啥菜式、樣品&#xff0c;輸入框中一應俱全&#xff0c;光論規格&#xff0c;可能已超過…

Validform使用入門

Validform使用入門 1、引入css 請查看下載文件中的style.css&#xff0c;把里面Validform必須部分復制到你的css中&#xff08;文件里這個注釋 "/*以下部分是Validform必須的*/" 之后的部分是必須的&#xff09;。之前發現有部分網友把整個style.css都引用在了頁面…

Java爬取并下載酷狗音樂

本文方法及代碼僅供學習&#xff0c;僅供學習。 案例&#xff1a; 下載酷狗TOP500歌曲&#xff0c;代碼用到的代碼庫包含&#xff1a;Jsoup、HttpClient、fastJson等。 正文&#xff1a; 1、分析是否可以獲取到TOP500歌單 打開酷狗首頁&#xff0c;查看TOP500&#xff0c;發現存…

C 表達式及返回值

以下程序的輸出結果是__A____。 #include<stdio.h> main() {int i10,j10;printf("%d,%d\n",i,j--); } A、11,10 B、9,10 C、010,9 D、10,9 8.若變量a、i已正確定義&#xff0c;且i已正確賦值&#xff0c;合法的語句是___B___。 A、a1 B、i; C、…