【SpirngBoot組件(1)】Swagger集成

個(gè)人學(xué)習(xí)筆記分享,當(dāng)前能力有限,請(qǐng)勿貶低,菜鳥(niǎo)互學(xué),大佬繞道

如有勘誤,歡迎指出和討論,本文后期也會(huì)進(jìn)行修正和補(bǔ)充

前言

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

因此,swagger幾乎已經(jīng)算的上是一個(gè)項(xiàng)目的必要組件了。

1.介紹

1.1.Swagger、Spring、SpringFox

  • Swagger是一個(gè)流行的API框架,對(duì)整個(gè)API開(kāi)發(fā)周期提供解決方案,包括設(shè)計(jì)、編碼和測(cè)試等等,幾乎支持所有語(yǔ)言。
  • Spring作為常用的Java開(kāi)發(fā)框架,不做多余敘述
  • SpringFox是一個(gè)基于Spring的組件,用于Swagger集成至SpringMVC,后發(fā)展至SpringFox,Springfox-swagger2則是其中一個(gè)組件
  • Springfox-Swagger-UI顧名思義則是一個(gè)UI組件,用于展示相關(guān)數(shù)據(jù)

總結(jié):

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

1.2.用途

  1. 前后端分離:前端只需要通過(guò)Swagger即可查找并調(diào)試接口
  2. API整理:暴露給外部的接口全部展示在Swagger,方便查找和整理
  3. 增強(qiáng)代碼可讀性:相關(guān)注解在后端也會(huì)使代碼可讀性更好,相當(dāng)于充當(dāng)了注釋的作用

2.集成

目前SpringFox已經(jīng)更新至3.0版本,修復(fù)了大量問(wèn)題,關(guān)鍵是配置方法做出了改變,故將SpringFox2SpringFox3分開(kāi)記錄

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())// 關(guān)聯(lián)配置文檔
                    .enable(true)// 是否啟用
                    .select()//掃描方法
                    .apis(RequestHandlerSelectors.basePackage("com.yezi_tool.basic_project.controller"))//掃描包路徑
                    .paths(PathSelectors.any())//路徑過(guò)濾
                    .build();//構(gòu)建
        }
    
        // 配置文檔信息
        private ApiInfo apiInfo() {
            return new ApiInfoBuilder()
                    .title("SpringBoot-Swagger2集成")
                    .description("API描述")
                    .contact("聯(lián)系人名字")
                    .version("1.0")
                    .build();
        }
    }
    
  3. 啟動(dòng)項(xiàng)目后,打開(kāi)網(wǎng)址http://localhost:8080/swagger-ui.html,請(qǐng)自行修改端口和路徑

2.2.swagger3版本

  1. 添加依賴

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

    僅此一個(gè)依賴

  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())// 關(guān)聯(lián)配置文檔
                    .select()//掃描方法
                    .apis(RequestHandlerSelectors.basePackage("com.yezi_tool.basic_project.controller"))//掃描包路徑
                    .paths(PathSelectors.any())//路徑過(guò)濾
                    .build();//構(gòu)建
        }
    
        // 配置文檔信息
        private ApiInfo apiInfo() {
            Contact contact = new Contact("聯(lián)系人名字", "http://xxx.xxx.com/聯(lián)系人訪問(wèn)鏈接", "聯(lián)系人郵箱");
            return new ApiInfo(
                    "Swagger學(xué)習(xí)", // 標(biāo)題
                    "學(xué)習(xí)演示如何配置Swagger", // 描述
                    "v1.0", // 版本
                    "http://terms.service.url/組織鏈接", // 組織鏈接
                    contact, // 聯(lián)系人信息
                    "Apach 2.0 許可", // 許可
                    "許可鏈接", // 許可連接
                    new ArrayList<>()// 擴(kuò)展
            );
        }
    }
    
  3. 啟動(dòng)項(xiàng)目后,打開(kāi)網(wǎng)址http://localhost:8080/swagger-ui/index.html,請(qǐng)自行修改端口和路徑

2.3.版本差異

  • swagger3進(jìn)行了大量更新與修復(fù),不做多述
  • swagger3僅需一個(gè)依賴,將swagger和UI合并
  • 配置文件的注解,swagger2需要@EnableSwagger2,而swagger3需要@EnableOpenApi
  • 配置文件的ApiInfo構(gòu)造方法變更,小問(wèn)題
  • 項(xiàng)目默認(rèn)地址變更,swagger2的地址是/swagger-ui.html,swagger3的地址是swagger-ui/index.html
  • 部分方法改動(dòng),如2.5的全局參數(shù)

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

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

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

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

  • docket對(duì)象方法

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

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

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

      • PathSelectors.any(): 任何請(qǐng)求都掃描
      • PathSelectors.none() : 任何請(qǐng)求都不掃描
      • PathSelectors.regex(final String pathRegex) : 通過(guò)正則表達(dá)式控制
      • PathSelectors.ant(final String antPattern) : 通過(guò)ant()控制
    • groupName():配置分組,參數(shù)為String字符串,如group 1,默認(rèn)分組為default,如需設(shè)置多個(gè)分組,則實(shí)例化多個(gè)不同名的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ù)(重點(diǎn))

通常用于設(shè)置token,swagger3修改了相關(guān)方法,所以此處均給出示例

  • 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())// 授權(quán)信息設(shè)置,必要的header token等認(rèn)證信息
            .securityContexts(securityContexts());// 授權(quán)信息全局應(yīng)用
            ...
        }
        /**
         * 設(shè)置授權(quán)信息
         */
        private List<SecurityScheme> securitySchemes() {
            return Collections.singletonList(new ApiKey("BASE_TOKEN", "token", "pass"));
        }
    
        /**
         * 授權(quán)信息全局應(yīng)用
         */
        private List<SecurityContext> securityContexts() {
            return Collections.singletonList(
                    SecurityContext.builder().securityReferences(Collections.singletonList(new SecurityReference("BASE_TOKEN", new AuthorizationScope[]{new AuthorizationScope("global", "")}))).build());
        }
    

3.使用

相關(guān)注解

  • @Api:用在類上,說(shuō)明該類的作用。

  • @ApiOperation:注解來(lái)給API增加方法說(shuō)明。

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

  • @ApiImplicitParam:用來(lái)注解來(lái)給方法入?yún)⒃黾诱f(shuō)明。

  • @ApiResponses:用于表示一組響應(yīng)

  • @ApiResponse:用在@ApiResponses中,一般用于表達(dá)一個(gè)錯(cuò)誤的響應(yīng)信息

    • code:返回碼,例如400

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

    • response:拋出異常的類

  • @ApiModel:描述一個(gè)Model的信息(一般用在請(qǐng)求參數(shù)無(wú)法使用@ApiImplicitParam注解進(jìn)行描述的時(shí)候)

  • @ApiModelProperty:描述一個(gè)model的屬性

  • @ApiIgnore:忽略某個(gè)api,可用于單個(gè)接口,也可用于整個(gè)controller

使用步驟

  1. 當(dāng)然一切的前提是先集成

  2. 添加注解

    • 實(shí)體類添加注解,實(shí)例如下

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

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

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

4.傳送門

Swagger2集成方案

Swagger3集成方案

SpringFox官方主頁(yè)

BB兩句

為啥總感覺(jué)swagger3變丑了好多。。。


作者:Echo_Ye

WX:Echo_YeZ

email :echo_yezi@qq.com

個(gè)人站點(diǎn):在搭了在搭了。。。(右鍵 - 新建文件夾)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容