【SpirngBoot組件(1)】Swagger集成

個人學習筆記分享,當前能力有限杨伙,請勿貶低,菜鳥互學萌腿,大佬繞道

如有勘誤限匣,歡迎指出和討論,本文后期也會進行修正和補充

前言

使用Swagger可以方便快捷的查看和調試接口毁菱,而不再需要借助其他第三方工具(如postman)膛腐,更不需要在茫茫代碼中尋找接口睛约,其相關注解也一定程度上提高了代碼可讀性。

因此哲身,swagger幾乎已經算的上是一個項目的必要組件了辩涝。

1.介紹

1.1.Swagger、Spring勘天、SpringFox

  • Swagger是一個流行的API框架怔揩,對整個API開發(fā)周期提供解決方案,包括設計脯丝、編碼和測試等等商膊,幾乎支持所有語言。
  • Spring作為常用的Java開發(fā)框架宠进,不做多余敘述
  • SpringFox是一個基于Spring的組件晕拆,用于Swagger集成至SpringMVC,后發(fā)展至SpringFox材蹬,Springfox-swagger2則是其中一個組件
  • Springfox-Swagger-UI顧名思義則是一個UI組件实幕,用于展示相關數(shù)據(jù)

總結:

  • Swagger是API解決方案
  • Spring是Java框架
  • SpringFox是基于Java的Swagger實現(xiàn)
  • Springfox-Swagger-UI是配套的UI

1.2.用途

  1. 前后端分離:前端只需要通過Swagger即可查找并調試接口
  2. API整理:暴露給外部的接口全部展示在Swagger,方便查找和整理
  3. 增強代碼可讀性:相關注解在后端也會使代碼可讀性更好堤器,相當于充當了注釋的作用

2.集成

目前SpringFox已經更新至3.0版本昆庇,修復了大量問題,關鍵是配置方法做出了改變闸溃,故將SpringFox2SpringFox3分開記錄

2.1.swagger2(主流版本)

  1. 添加依賴

    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.6.1</version>
    </dependency>
    
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.6.1</version>
    </dependency>
    

    前者為swagger2依賴整吆,后者為ui,后者可以更換為其他ui辉川,此處不做多述

  2. 創(chuàng)建swagger配置文件

    @Configuration
    @EnableSwagger2
    @Profile({"dev", "test"})
    public class SwaggerConfig {
        @Bean // 配置docket以配置Swagger具體參數(shù)
        public Docket docket(Environment environment) {
    
            return new Docket(DocumentationType.SWAGGER_2)
                    .apiInfo(apiInfo())// 關聯(lián)配置文檔
                    .enable(true)// 是否啟用
                    .select()//掃描方法
                    .apis(RequestHandlerSelectors.basePackage("com.yezi_tool.basic_project.controller"))//掃描包路徑
                    .paths(PathSelectors.any())//路徑過濾
                    .build();//構建
        }
    
        // 配置文檔信息
        private ApiInfo apiInfo() {
            return new ApiInfoBuilder()
                    .title("SpringBoot-Swagger2集成")
                    .description("API描述")
                    .contact("聯(lián)系人名字")
                    .version("1.0")
                    .build();
        }
    }
    
  3. 啟動項目后表蝙,打開網址http://localhost:8080/swagger-ui.html,請自行修改端口和路徑

2.2.swagger3版本

  1. 添加依賴

            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-boot-starter</artifactId>
                <version>3.0.0</version>
            </dependency>
    

    僅此一個依賴

  2. 創(chuàng)建swagger配置文件

    @Configuration
    @EnableOpenApi
    @Profile({"dev", "test"})
    public class Swagger3Config {
        @Bean // 配置docket以配置Swagger具體參數(shù)
        public Docket docket() {
            return new Docket(DocumentationType.OAS_30)//文檔類型
                    .apiInfo(apiInfo())// 關聯(lián)配置文檔
                    .select()//掃描方法
                    .apis(RequestHandlerSelectors.basePackage("com.yezi_tool.basic_project.controller"))//掃描包路徑
                    .paths(PathSelectors.any())//路徑過濾
                    .build();//構建
        }
    
        // 配置文檔信息
        private ApiInfo apiInfo() {
            Contact contact = new Contact("聯(lián)系人名字", "http://xxx.xxx.com/聯(lián)系人訪問鏈接", "聯(lián)系人郵箱");
            return new ApiInfo(
                    "Swagger學習", // 標題
                    "學習演示如何配置Swagger", // 描述
                    "v1.0", // 版本
                    "http://terms.service.url/組織鏈接", // 組織鏈接
                    contact, // 聯(lián)系人信息
                    "Apach 2.0 許可", // 許可
                    "許可鏈接", // 許可連接
                    new ArrayList<>()// 擴展
            );
        }
    }
    
  3. 啟動項目后乓旗,打開網址http://localhost:8080/swagger-ui/index.html勇哗,請自行修改端口和路徑

2.3.版本差異

  • swagger3進行了大量更新與修復,不做多述
  • swagger3僅需一個依賴寸齐,將swagger和UI合并
  • 配置文件的注解欲诺,swagger2需要@EnableSwagger2,而swagger3需要@EnableOpenApi
  • 配置文件的ApiInfo構造方法變更渺鹦,小問題
  • 項目默認地址變更扰法,swagger2的地址是/swagger-ui.htmlswagger3的地址是swagger-ui/index.html
  • 部分方法改動毅厚,如2.5的全局參數(shù)

2.4.配置文件額外參數(shù)

通常上述參數(shù)已滿足需求塞颁,當然還提供了其他參數(shù)供開發(fā)者選擇,兩個版本的自定義參數(shù)基本一致

  • 注解@Profile:枚舉適用的運行環(huán)境,通常僅在開發(fā)環(huán)境和測試環(huán)境中啟用祠锣,則可使用@Profile({"dev", "test"})

  • 配置文檔信息:請根據(jù)需求修改酷窥,不做多述

  • docket對象方法

    • enable():是否啟用swagger,參數(shù)為true/false伴网,但通常用注解@Profile控制

    • api():指定包掃描路徑蓬推,參數(shù)形如RequestHandlerSelectors.basePackage("com.test.api"),也可以根據(jù)自身需求調整澡腾,其余形式參數(shù)如下

      • RequestHandlerSelectors.any():掃描所有沸伏,項目中的所有接口都會被掃描到
      • RequestHandlerSelectors.none() :不掃描接口
      • RequestHandlerSelectors.withMethodAnnotation(final Class<? extends Annotation> annotation): 通過方法上的注解掃描,如withMethodAnnotation(GetMapping.class)只掃描get請求
      • RequestHandlerSelectors.withClassAnnotation(final Class<? extends Annotation> annotation): 通過類上的注解掃描动分,如.withClassAnnotation(Controller.class)只掃描有controller注解的類中的接口
      • RequestHandlerSelectors.basePackage(final String basePackage) : 根據(jù)包路徑掃描接口
    • paths():指定url路徑過濾毅糟,參數(shù)形如PathSelectors.ant("/login/**"),也可以根據(jù)自身需求調整澜公,其余形式參數(shù)如下

      • PathSelectors.any(): 任何請求都掃描
      • PathSelectors.none() : 任何請求都不掃描
      • PathSelectors.regex(final String pathRegex) : 通過正則表達式控制
      • PathSelectors.ant(final String antPattern) : 通過ant()控制
    • groupName():配置分組姆另,參數(shù)為String字符串,如group 1坟乾,默認分組為default迹辐,如需設置多個分組,則實例化多個不同名的docket即可

    • getGlobalOperationParameters:全局參數(shù)糊渊,不適用于swagger3,通常用于token慧脱,示例如下

              ParameterBuilder ticketPar = new ParameterBuilder();
              List<Parameter> pars = new ArrayList<Parameter>();
              ticketPar.name("token")
                      .description("token")
                      .modelRef(new ModelRef("string"))
                      .parameterType("header")
                      .required(false)
                      .build();
              pars.add(ticketPar.build());
              docket.globalOperationParameters(pars)
      

2.5.全局參數(shù)(重點)

通常用于設置token渺绒,swagger3修改了相關方法,所以此處均給出示例

  • swagger2版本

      public Docket docket() {
            ...
          docket.globalOperationParameters(pars);
            ...
        }
                
        private List<Parameter> pars(){
            List<Parameter> pars = new ArrayList<Parameter>();
            ParameterBuilder ticketPar = new ParameterBuilder();
            ticketPar.name("token")
                    .description("token")
                    .modelRef(new ModelRef("string"))
                    .parameterType("header")
                    .required(false)
                    .build();
            pars.add(ticketPar.build());
            return pars;
        }
    
  • swagger3版本

      public Docket docket() {
            ...
          docket.protocols(new LinkedHashSet<>(Arrays.asList("https", "http")))// 支持的通訊協(xié)議集合
            .securitySchemes(securitySchemes())// 授權信息設置菱鸥,必要的header token等認證信息
            .securityContexts(securityContexts());// 授權信息全局應用
            ...
        }
        /**
         * 設置授權信息
         */
        private List<SecurityScheme> securitySchemes() {
            return Collections.singletonList(new ApiKey("BASE_TOKEN", "token", "pass"));
        }
    
        /**
         * 授權信息全局應用
         */
        private List<SecurityContext> securityContexts() {
            return Collections.singletonList(
                    SecurityContext.builder().securityReferences(Collections.singletonList(new SecurityReference("BASE_TOKEN", new AuthorizationScope[]{new AuthorizationScope("global", "")}))).build());
        }
    

3.使用

相關注解

  • @Api:用在類上宗兼,說明該類的作用。

  • @ApiOperation:注解來給API增加方法說明氮采。

  • @ApiImplicitParams : 用在方法上包含一組參數(shù)說明殷绍。

  • @ApiImplicitParam:用來注解來給方法入參增加說明。

  • @ApiResponses:用于表示一組響應

  • @ApiResponse:用在@ApiResponses中鹊漠,一般用于表達一個錯誤的響應信息

    • code:返回碼主到,例如400

    • message:信息,例如"參數(shù)錯誤"

    • response:拋出異常的類

  • @ApiModel:描述一個Model的信息(一般用在請求參數(shù)無法使用@ApiImplicitParam注解進行描述的時候)

  • @ApiModelProperty:描述一個model的屬性

  • @ApiIgnore:忽略某個api躯概,可用于單個接口登钥,也可用于整個controller

使用步驟

  1. 當然一切的前提是先集成

  2. 添加注解

    • 實體類添加注解,實例如下

      @ApiModel("登錄信息實體")
      public class LoginRequest {
         @ApiModelProperty("用戶名")
         public String username;
         @ApiModelProperty("密碼")
         public String password;
      }
      
    • 控制器添加注解娶靡,實例如下

      @Controller
      @RequestMapping("/testController")
      @Api(tags = "測試")
      public class TestController {
      }
      
    • 接口方法添加注解牧牢,實例如下

          @ApiOperation("測試swagger")
          @PostMapping("/testSwagger")
          @ResponseBody
          public LoginRequest testSwagger(@ApiParam(required = false, value = "登錄實體") @RequestParam(required = false) @RequestBody LoginRequest loginRequest) throws Exception {
              if (loginRequest == null) {
                  loginRequest = new LoginRequest();
              }
              return loginRequest;
          }
      
    • swagger測試,沒什么好貼圖的,就省了吧塔鳍。伯铣。

4.傳送門

Swagger2集成方案

Swagger3集成方案

SpringFox官方主頁

BB兩句

為啥總感覺swagger3變丑了好多。轮纫。腔寡。


作者:Echo_Ye

WX:Echo_YeZ

email :echo_yezi@qq.com

個人站點:在搭了在搭了。蜡感。蹬蚁。(右鍵 - 新建文件夾)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市郑兴,隨后出現(xiàn)的幾起案子犀斋,更是在濱河造成了極大的恐慌,老刑警劉巖情连,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叽粹,死亡現(xiàn)場離奇詭異,居然都是意外死亡却舀,警方通過查閱死者的電腦和手機虫几,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挽拔,“玉大人辆脸,你說我怎么就攤上這事◇ψ纾” “怎么了啡氢?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長术裸。 經常有香客問我倘是,道長,這世上最難降的妖魔是什么袭艺? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任搀崭,我火速辦了婚禮,結果婚禮上猾编,老公的妹妹穿的比我還像新娘瘤睹。我一直安慰自己,他們只是感情好答倡,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布默蚌。 她就那樣靜靜地躺著,像睡著了一般苇羡。 火紅的嫁衣襯著肌膚如雪绸吸。 梳的紋絲不亂的頭發(fā)上鼻弧,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天,我揣著相機與錄音锦茁,去河邊找鬼攘轩。 笑死,一個胖子當著我的面吹牛码俩,可吹牛的內容都是我干的度帮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼稿存,長吁一口氣:“原來是場噩夢啊……” “哼笨篷!你這毒婦竟也來了?” 一聲冷哼從身側響起瓣履,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤率翅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后袖迎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冕臭,經...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年燕锥,在試婚紗的時候發(fā)現(xiàn)自己被綠了辜贵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡归形,死狀恐怖托慨,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情暇榴,我是刑警寧澤厚棵,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站跺撼,受9級特大地震影響窟感,放射性物質發(fā)生泄漏讨彼。R本人自食惡果不足惜歉井,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哈误。 院中可真熱鬧哩至,春花似錦、人聲如沸蜜自。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽重荠。三九已至箭阶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仇参。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工嘹叫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人诈乒。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓罩扇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親怕磨。 傳聞我的和親對象是個殘疾皇子喂饥,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359