日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Boot 集成 Swagger 生成 RESTful API 文档

發布時間:2025/5/22 javascript 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Boot 集成 Swagger 生成 RESTful API 文档 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文鏈接:

  • Spring Boot 集成 Swagger 生成 RESTful API 文檔

簡介

Swagger 官網是這么描述它的:The Best APIs are Built with Swagger Tools。

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

  • Swagger Editor:基于瀏覽器的編輯器,我們可以使用它編寫我們 OpenAPI 規范。
  • Swagger UI:它會將我們編寫的 OpenAPI 規范呈現為交互式的 API 文檔,后文我將使用瀏覽器來查看并且操作我們的 Rest API。
  • Swagger Codegen:它可以通過為 OpenAPI(以前稱為 Swagger)規范定義的任何 API 生成服務器存根和客戶端 SDK 來簡化構建過程。
  • Spring Boot 使得開發 RESTful 服務變得簡單。那么編寫 Spring Boot 接口,為何要用 Swagger 呢?

    • 代碼改變,文檔就會改變。只需要少量的注釋,Swagger 就可以根據代碼自動生成 API 文檔。
    • Swagger UI 是一份交互式的 API 文檔,可以直接在 Web 界面調用 API。這里有一份 Swagger UI 的 Live Demo,看看官方是怎么寫 RESTful API 的。

    添加依賴

    pom.xml 引入 Swagger 相關的依賴:

    <!-- 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>

    使用 property 定義了 Swagger 的版本,因此還需要添加:

    <swagger.version>2.9.2</swagger.version>

    依賴說明:

    • springfox-swagger2 Swagger 的 Java 實現
    • springfox-swagger-ui Swagger UI 頁面的依賴

    Swagger 配置類

    使用注解 @Configuration 編寫 Swagger 配置類—— SwaggerConfig。

    新建 config 的包,創建 SwaggerConifg 的配置類:

    //通過@Configuration注解,讓Spring來加載該類配置 @Configuration //通過@EnableSwagger2注解來啟用Swagger2 @EnableSwagger2 //@ConditionalOnExpression 為Spring的注解,用戶是否實例化本類,用于是否啟用Swagger的判斷(生產環境需要屏蔽Swagger) @ConditionalOnExpression("${swagger.enable:true}") public class SwaggerConfig {// select()函數返回一個ApiSelectorBuilder實例用來控制哪些接口暴露給Swagger來展現,本例采用指定掃描的包路徑來定義,// Swagger會掃描該包下所有Controller定義的API,并產生文檔內容(除了被@ApiIgnore指定的請求)@Beanpublic Docket createRestApi() {// apiInfo()用來創建該Api的基本信息(這些基本信息會展現在文檔頁面中ApiInfo apiInfo = new ApiInfoBuilder().title("標題: Spring Boot 項目集成 Swagger 示例文檔").description("描述: 我的博客地址是 https://michael728.github.io").termsOfServiceUrl("https://michael728.github.io/").version("1.0").build();Docket docket = new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo)// select()函數返回一個ApiSelectorBuilder實例.select()// 決定了暴露哪些接口給 Swagger.paths(regex("/api/.*")).build().useDefaultResponseMessages(false).gloreturn docket;} }

    說明:

    • @Configuration 是告訴 Spring Boot 需要加載這個配置類;
    • @EnableSwagger2 是啟用 Swagger2,沒加的話,就看不到效果了;
    • ApiInfo 對象用來設置一些文檔的版本號、聯系人郵箱、網站、版權、開源協議等等信息(這些基本信息會展現在文檔頁面中)。并使用 Docket.apiInfo() 方法來設置;
    • Docket 上增加篩選。提供了 apis() 和 paths() 兩個方法幫助我們在不同級別上過濾接口:
      • apis() 這種方式我們可以指定包名的方式,讓 Swagger 只去某些包下面掃描;
      • paths() 這種方式可以通過篩選 API 的 url 來進行篩選;
    • @ConditionalOnExpression("${swagger.enable:true}") 這個注解控制了是否啟用 Swagger,我們需要在 appplication.properties 中加上 swagger.enable=true

    編寫控制器類——Controller 類

    我們先介紹一下在用 Swagger 時的常用注解:

    • @API 類的注解,可以給控制器增加描述和標簽信息。用在請求的類上,代表了這個類是 Swagger 的資源
      • tags:控制器標簽,對該類進行「分類」,參數是個字符串數組,如果配置了多個值,會在多個分類中看到;
      • value:該參數沒什么意義,在 UI 界面上并不顯示,可不用配置
    • @ApiModel 類注解,對 API 涉及的對象做描述,可用于響應實體類,說明實體作用
      • value Model 展示時的名稱,默認是 實體類的名稱,比如 UserEntity;
      • description 實體類的描述

    類成員變量的的注解:

    • @ApiModelProperty 用在實體類的屬性上
      • value 屬性字段描述;
      • required 參數是否必選;
      • name 重寫字段名稱;
      • dataType 重寫字段類型;
      • allowEmptyValue 是否允許為空;
      • allowbleValues 該字段允許的值。當我們 API 某個參數為枚舉類型時,使用這個參數就可以清楚高速 API 使用者能允許傳入的值

    方法的注解:

    • @ApiOperation 描述方法的用途,用來展開對接口的描述
      • value 接口簡要描述;
      • notes 接口發布說明,詳細描述;
    • @ApiImplicitParams 用于描述接口的非對象參數集,一般與 @ApiImplicitParams 組合使用
    • @ApiImplicitParam 描述參數信息
      • value 參數意義的描述
      • name 參數名字;
      • required 默認 false,參數是否必傳
      • dataType 參數數據類型,只作為標志說明,并沒有實際驗證
        • Long
        • String
      • paramType 參數類型,表示參數放在哪里
        • query,默認值,Query String 的方式傳參,請求參數的獲取:@RequestParam
        • path 路徑參數,請求參數的獲取:@PathVariable
        • header 請求參數的獲取:@RequestHeader
    • @PathVariable 路徑參數,給類似 @GetMappIng("/user/{id}") 參數通過路徑傳入

    其他:

    • @ApiIgnore:用于類或者方法上,屏蔽接口不被顯示在頁面上;
    • @Profile({"dev","test"}):用于配置類上,表示對什么環境啟用;
    • @ApiParam 不能直接用在方法上,而是用在方法的形參定義中,下文會有示例;

    實體類示例:

    @Data @ApiModel(value = "用戶實體") public class UserEntity {public static final long serialVersionUID = 1L;@ApiModelProperty(value = "用戶 id")private int id;@ApiModelProperty(value = "用戶名", required = true)private String userName;@ApiModelProperty(value = "密碼" )private String passWord;@ApiModelProperty(value = "性別")private UserSexEnum userSex;@ApiModelProperty(value = "昵稱" )private String nickName;public UserEntity(Integer id, String userName, String passWord) {this.id = id;this.userName = userName;this.passWord = passWord;} }

    下面是一個控制類的示例:

    @RestController @RequestMapping("/api/v1/") @Api(tags = {"用戶相關接口"}, value = "用戶模塊") public class UserController {// 模擬數據庫public static List<UserEntity> users = new ArrayList<>();static {UserEntity user1 = new UserEntity(1, "michael", "123");UserEntity user2 = new UserEntity(2, "qq", "123");UserEntity user3 = new UserEntity(3, "hh", "123");users.add(user1);users.add(user2);users.add(user3);}@ApiOperation(value = "獲取用戶列表", notes = "獲取全部用戶信息")@RequestMapping(value = "/users", method = RequestMethod.GET)public List<UserEntity> getUsers() {return users;}@ApiOperation(value = "查詢單用戶", notes = "根據用戶id 查詢其信息")@ApiImplicitParam(name = "id", value = "用戶id", paramType = "query", required = true)@GetMapping("/user/{id}")public UserEntity getUser(@PathParam("id") int id) {UserEntity user = users.get(id);return user;}@ApiOperation(value = "存儲用戶信息", notes = "存儲用戶詳細信息")@RequestMapping(value = "/user", method = RequestMethod.POST)public UserEntity saveUser(@ApiParam(value = "用戶信息", required = true)@RequestBody UserEntity user) {users.add(user);return user;}@ApiOperation(value = "刪除用戶", notes = "根據用戶id刪除用戶信息")@ApiImplicitParams({@ApiImplicitParam(name = "id", value = "用戶id", required = true, paramType = "path")})@RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE)public int deleteUser(@PathVariable("id") int id) {users.remove(id);return id;}@ApiOperation(value = "更新用戶信息", notes = "更新用戶的個人信息")@PutMapping("/user/")public UserEntity updateUser(@RequestBody UserEntity user) {int id = user.getId();UserEntity oldUser = users.get(id);users.set(id, user);return user;} }

    啟動

    啟動應用,訪問 localhost:8080/swagger-ui.html 可以訪問到 Swagger UI,可以點擊 Try it out 按鈕,調用 API:

    頁面上還會有一個 Models 的分類。Swagger UI 會根據我們在實體上使用的 @ApiModel 和 @ApiModelProperty 注解來自動補充實體以及其屬性的描述和備注。

    示例代碼

    • awesome-spring-boot-examples

    One More Thing

    Web API 的風格

    開發 API,先了解一下有哪些 Web API 的風格吧:

    • RPC:RPC 面向過程,RPC 形式的 API 組織形態是類和方法,API 的命名往往是一個動詞,比如 GetUserInfo,CreateUser;
    • REST:REST 面向資源,也是下文將要介紹的一種 API 風格;
    • GraphQL:就是面向數據查詢,采用GraphQL,甚至不需要有任何的接口文檔,在定義了Schema之后,服務端實現Schema,客戶端可以查看Schema,然后構建出自己需要的查詢請求來獲得自己需要的數據

    REST

    上文提到了 RESTful API 的概念,我覺得,不如趁機了解一下。因為在實際的項目中發現,并不是每個 Spring Boot 的開發人員都能意識到開發的 API 要盡量符合 RESTful 規則的。REST 實際上只是一種設計風格,它并不是標準。

    術語:

    • Endpoint 終點,可以理解為路徑,表示 API 的具體網址。
    • API(Application Programming Interface),應用程序編程接口
    • REST 是 Representational State Transfer 的縮寫。如果一個架構符合 REST 原則,就稱它為 RESTful 架構。RESTful API 就是 REST 風格的 API
      • Resource:資源,即數據。
      • Representational:某種表現形式,比如用 JSON,XML,JPEG 等;
      • State Transfer:狀態變化。通過 HTTP 動詞實現

    在 RESTful 架構中,每個網址代表一種資源(resource),所以網址中不能有動詞,只能有名詞,而且所用的名詞往往與數據庫的表格名對應。

    資源的操作

    RESTful 的核心思想就是,客戶端發出的數據操作指令都是"動詞 + 賓語"的結構。比如,GET /articles 這個命令,GET 是動詞,/articles 是賓語。

    對于資源的具體操作類型,由 HTTP 動詞表示(括號里是對應的 SQL 命令):

    • GET(SELECT):從服務器取出資源(一項或多項)。
    • POST(CREATE):在服務器新建一個資源。
    • PUT(UPDATE):在服務器更新資源(客戶端提供改變后的完整資源)。
    • PATCH(UPDATE):在服務器更新資源(客戶端提供改變的屬性)。
    • DELETE(DELETE):從服務器刪除資源

    還有兩個不常用的 HTTP 動詞:

    • HEAD:獲取資源的元數據。
    • OPTIONS:獲取信息,關于資源的哪些屬性是客戶端可以改變的

    知乎上的一個回答,我覺得很精辟:

    • 看 Url 就知道要什么
    • 看 http method 就知道干什么
    • 看 http status code 就知道結果如何

    一位答主給出的示例:

    GET /rest/api/getDogs --> GET /rest/api/dogs 獲取所有小狗狗 GET /rest/api/addDogs --> POST /rest/api/dogs 添加一個小狗狗 GET /rest/api/editDogs/:dog_id --> PUT /rest/api/dogs/:dog_id 修改一個小狗狗 GET /rest/api/deleteDogs/:dog_id --> DELETE /rest/api/dogs/:dog_id 刪除一個小狗狗

    信息過濾 Filtering

    如果記錄數量很多,服務器不可能都將它們返回給用戶。API 應該提供參數,過濾返回結果

    • ?limit=10:指定返回記錄的數量
    • ?offset=10:指定返回記錄的開始位置。
    • ?page=2&per_page=100:指定第幾頁,以及每頁的記錄數

    參考

    • CSDN-Spring Boot集成Swagger
    • 官宣-Swagger
    • IBM-在 Spring Boot 項目中使用 Swagger 文檔
    • 蜻蜓HTTP-springboot 集成完整的swagger2

    API 介紹

    • 阮一峰-RESTful API 設計指南
    • 阮一峰-RESTful API 最佳實踐
    • segmentfault-Philipp Hauer-[譯]RESTful API 設計最佳實踐 推薦
    • RESTful Service API 設計最佳工程實踐和常見問題解決方案 總結的相當好,博客值得閱讀
    • 華為云-API設計中關于RPC和REST 兩種風格選擇的個人理解
    • 跟著 Github 學習 Restful HTTP API 設計
    • 梁桂釗——人人都是 API 設計師:我對 RESTful API、GraphQL、RPC API 的思考 作者分享了一些阿里團隊里做法
    • 阿里研究員谷樸:API 設計最佳實踐的思考
    • 朱曄的互聯網架構實踐心得S2E5:淺談四種API設計風格(RPC、REST、GraphQL、服務端驅動)

    歡迎關注個人公眾號 「iPlayMichael」

    轉載于:https://www.cnblogs.com/michael-xiang/p/11216862.html

    總結

    以上是生活随笔為你收集整理的Spring Boot 集成 Swagger 生成 RESTful API 文档的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 人人爽人人爽人人片 | 91美女视频在线观看 | 久久这里都是精品 | 激情无码人妻又粗又大 | 欧美黄色一级网站 | 欧美成人精品一区二区男人小说 | www.爱爱| 日批黄色 | 日韩成人性视频 | 精品国自产拍在线观看 | 免费国产一区二区三区 | 欧美在线亚洲 | 久热精品免费视频 | 99人人爽 | 亚洲国产欧美一区 | 亚洲欧美日韩第一页 | 欧美手机在线 | 在线观看日本中文字幕 | 午夜理伦三级理论 | 成人黄网免费观看视频 | 亚洲AV成人无码网站天堂久久 | 国产精选视频 | 三级精品在线观看 | 日韩精品免费 | 欧美在线一卡 | 男女日批在线观看 | 二十四小时在线更新观看 | 午夜成年视频 | 性高湖久久久久久久久免费 | 成人h动漫精品一区二区器材 | 91九色蝌蚪porny| 久久av无码精品人妻系列试探 | 欧美另类第一页 | 樱桃成人精品视频在线播放 | 日本午夜免费福利视频 | 91无打码| 91资源在线视频 | 久久网一区| 大奶在线播放 | 免费视频91蜜桃 | 九一福利视频 | 欧美www| 91成人福利视频 | 色综合久久精品亚洲国产 | 精品国产一区二区三区久久久 | 中日黄色片 | 国产小视频在线看 | 波多野结衣午夜 | 国产又粗又猛又爽又黄的 | 全黄一级男人和女人 | 色呦呦入口 | 欧美放荡性医生videos | 精品夜夜澡人妻无码av | 天天射寡妇射 | 夜夜爽夜夜 | 日韩在线播放中文字幕 | 国产理论一区 | 久久久久亚洲AV | 国产欧美久久久久 | 日韩一区二区三区中文字幕 | 97超碰人人草 | 最新国产网址 | 日本亚洲免费 | 久久伊人影院 | 巨乳女教师的诱惑 | 久久久丁香 | 一级片一级片 | 欧美自拍偷拍一区二区 | 久久精选视频 | 亚洲国产精品成人va在线观看 | 黄色大片免费在线观看 | 极品美女无套呻吟啪啪 | 樱花电影最新免费观看国语版 | 中文字幕不卡在线观看 | 欧美一区二区三区粗大 | 色性av| 中文字幕一区二区三区在线视频 | 国产一级二级三级精品 | 日韩高清在线一区二区 | 午夜黄色 | 天天干夜夜草 | 日本一区二区三区欧美 | 日本不卡一区视频 | 日本乱淫视频 | 伊人av综合网 | 岛国大片在线观看 | www.啪啪| 国产无码精品在线播放 | 另类视频一区 | 黄色的一级片 | 中文天堂在线观看 | 精品在线免费视频 | 亚洲视频六区 | 蜜桃av鲁一鲁一鲁一鲁俄罗斯的 | 99精品免费在线观看 | 性欧美大战久久久久久久免费观看 | 欧美猛男gaygay| 91蜜臀精品国产自偷在线 | 超碰人人人人人 |