<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          "絲襪哥"Swagger來(lái)了(整合SpringBoot)

          共 18791字,需瀏覽 38分鐘

           ·

          2021-05-30 08:52

          點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”

          優(yōu)質(zhì)文章,第一時(shí)間送達(dá)

            作者 |  Baret-H

          來(lái)源 |  urlify.cn/3qq26j

          學(xué)習(xí)目標(biāo):


          • 了解Swagger的作用和概念

          • 了解前后端分離

          • SpringBoot繼承Swagger

          一、Swagger簡(jiǎn)介

          1. 前后端分離

          后端時(shí)代:前端只用管理靜態(tài)頁(yè)面;html等靜態(tài)資源交給后端通過(guò)模板引擎進(jìn)行渲染

          前后端分離時(shí)代

          • 后端:控制層controller、服務(wù)層service、數(shù)據(jù)訪問(wèn)層dao

          • 前端:前端控制層、視圖層

          • 前后端交互:通過(guò)API接口

          • 前后端相對(duì)獨(dú)立,松耦合,甚至可以部署在不同的服務(wù)器上

          隨之產(chǎn)生的問(wèn)題:前后端聯(lián)調(diào),前端人員和后端人員無(wú)法做到及時(shí)協(xié)商,盡早解決

          解決方案

          • 首先指定schema,實(shí)時(shí)更新最新的API,降低集成風(fēng)險(xiǎn)

          • 早些年:指定word計(jì)劃文檔

          • 前后端分離:

            • 前端測(cè)試后端接口數(shù)據(jù)是否正確:postman

            • 后端提供接口,需要實(shí)時(shí)更新最新的消息和改動(dòng)

          于是Swagger應(yīng)運(yùn)而生

          2. Swagger引入

          • 號(hào)稱歷史上最流行的api框架

          • RestFul Api文檔在線生成工具=》Api文檔與Api定義同步更新

          • 直接運(yùn)行,可以在線測(cè)試Api接口

          • 支持多種語(yǔ)言

          官網(wǎng):https://swagger.io/

          二、SpringBoot集成Swagger

          1. 新建springboot項(xiàng)目

          首先新建一個(gè)spirngboot項(xiàng)目,勾選組件時(shí)勾選Spring-Web



          2. 導(dǎo)入Swagger依賴

          springfox-swagger2

          <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
          <dependency>
              <groupId>io.springfox</groupId>
              <artifactId>springfox-swagger2</artifactId>
              <version>3.0.0</version>
          </dependency>

          springfox-swagger-ui

          <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
          <dependency>
              <groupId>io.springfox</groupId>
              <artifactId>springfox-swagger-ui</artifactId>
              <version>3.0.0</version>
          </dependency>


          3. 編寫HelloController測(cè)試

          我們編寫一個(gè)controller來(lái)測(cè)試一下項(xiàng)目是否搭建成功,在主程序同級(jí)目錄下新建controller包,其中新建HelloController

          package com.zsr.controller;

          import org.springframework.web.bind.annotation.RequestMapping;
          import org.springframework.web.bind.annotation.RestController;

          @RestController
          public class HelloController {
              @RequestMapping("/hello")
              public String hello() {
                  return "hello";
              }
          }


          然后啟動(dòng)主程序,訪問(wèn)localhost:8080/hello,出現(xiàn)如下結(jié)果即成功



          4. 編寫Swagger配置類

          在主程序同級(jí)目錄下新建config包,其中新建SwaggerConfig配置類

          • 記住用@Configuration注解注明這是配置類

          • 同時(shí)用@EnableSwagger2注解開啟Swagger2

          package com.zsr.config;

          import org.springframework.context.annotation.Configuration;
          import springfox.documentation.swagger2.annotations.EnableSwagger2;

          @Configuration
          @EnableSwagger2//開啟Swagger2
          public class SwaggerConfig {

          }




          5. 測(cè)試進(jìn)入Sawgger頁(yè)面

          重啟主程序,訪問(wèn)localhost:8080/swagger-ui.html

          啟動(dòng)報(bào)錯(cuò):@EnableSwagger2注解找不到,但是已經(jīng)導(dǎo)入了對(duì)應(yīng)的jar包


          這時(shí)候降級(jí)為2.9.2即可使用

          <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
          <dependency>
              <groupId>io.springfox</groupId>
              <artifactId>springfox-swagger2</artifactId>
              <version>2.9.2</version>
          </dependency>

          <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
          <dependency>
              <groupId>io.springfox</groupId>
              <artifactId>springfox-swagger-ui</artifactId>
              <version>2.9.2</version>
          </dependency>


          再次啟動(dòng)主程序即可成功,然后訪問(wèn)localhost:8080/swagger-ui.html,即可進(jìn)入到以下界面

          這個(gè)界面是Swagger為我們提供的ui界面,我們可以在源碼中找到它



          6. 配置Swagger API信息

          在Swagger提供的ui界面,其中的Swagger信息模塊我們可以自定義信息內(nèi)容

          我們只需要在Swagger配置類SwaggerConfig中實(shí)例化Docket類隊(duì)對(duì)象的bean實(shí)例,通過(guò)配置ApiInfo類的信息然后傳入Docket的bean實(shí)例即可

          package com.zsr.config;

          import org.springframework.context.annotation.Bean;
          import org.springframework.context.annotation.Configuration;
          import springfox.documentation.service.ApiInfo;
          import springfox.documentation.service.Contact;
          import springfox.documentation.service.VendorExtension;
          import springfox.documentation.spi.DocumentationType;
          import springfox.documentation.spring.web.plugins.Docket;
          import springfox.documentation.swagger2.annotations.EnableSwagger2;

          import java.util.ArrayList;

          @Configuration
          @EnableSwagger2//開啟Swagger2
          public class SwaggerConfig {
              //配置Swagger的Docket的bean實(shí)例
              @Bean
              public Docket docket() {
                  return new Docket(DocumentationType.SWAGGER_2)
                          .apiInfo(apiInfo());//配置Swagger信息
              }

              //配置Swagger信息
              private ApiInfo apiInfo() {
                  return new ApiInfo(
                          "Baret-H",
                          "我的Swagger API文檔",
                          "1.0",
                          "https://bareth.blog.csdn.net/",
                          new Contact("Baret-H""https://bareth.blog.csdn.net/""[email protected]"),//作者信息
                          "Apache 2.0",
                          "http://www.apache.org/licenses/LICENSE-2.0",
                          new ArrayList<VendorExtension>());
              }
          }


          重啟主程序測(cè)試,可以看到Swagger信息已經(jīng)變更成我們定義的信息



          7. 配置Swagger自定義掃描接口

          我們?cè)谶@個(gè)ui界面中,可以看到掃描了兩個(gè)controller接口;

          • 一個(gè)是默認(rèn)的/error請(qǐng)求,也就是我們啟動(dòng)springboot主程序未加配置默認(rèn)訪問(wèn)8080端口的默認(rèn)controller

          • 另一個(gè)是我們自己寫的/hello請(qǐng)求,對(duì)應(yīng)著HelloController,由于我們用的@RequsetMapping注解,所以請(qǐng)求的方式有以上的六種

          接下來(lái)我們自己配置以下要掃描的接口

          @Bean
          public Docket docket() {
              return new Docket(DocumentationType.SWAGGER_2)
                      .apiInfo(apiInfo())//配置Swagger信息
                      .select()
                      /**
                       * apis():指定掃描的接口
                       *  RequestHandlerSelectors:配置要掃描接口的方式
                       *       basePackage:指定要掃描的包
                       *       any:掃面全部
                       *       none:不掃描
                       *       withClassAnnotation:掃描類上的注解(參數(shù)是類上注解的class對(duì)象)
                       *       withMethodAnnotation:掃描方法上的注解(參數(shù)是方法上的注解的class對(duì)象)
                       */
                      .apis(RequestHandlerSelectors.basePackage("com.zsr.controller"))
                      /**
                       * paths():過(guò)濾路徑
                       *  PathSelectors:配置過(guò)濾的路徑
                       *      any:過(guò)濾全部路徑
                       *      none:不過(guò)濾路徑
                       *      ant:過(guò)濾指定路徑:按照按照Spring的AntPathMatcher提供的match方法進(jìn)行匹配
                       *      regex:過(guò)濾指定路徑:按照String的matches方法進(jìn)行匹配
                       */
                      .paths(PathSelectors.ant("/zsr/**"))
                      .build();
          }


          其中.select().apis.paths.build是一套組合進(jìn)行使用

          然后我們啟動(dòng)主程序訪問(wèn)localhost:8080/swagger-ui.html進(jìn)行測(cè)試

          可以發(fā)現(xiàn)No opertations defined in spec,這是因?yàn)槲覀冞^(guò)濾了/zsr下的所有controller

          我們將過(guò)濾條件更改為過(guò)濾全部路徑

          .paths(PathSelectors.any)


          再次啟動(dòng)主程序訪問(wèn)localhost:8080/swagger-ui.html

          可以看到只顯示了我們上述自定義的com.zsr.controller下的接口HelloController

          .apis(RequestHandlerSelectors.basePackage("com.zsr.controller"))




          8. 配置是否啟動(dòng)Swagger

          我么通過(guò)Docket對(duì)象的.enable方法來(lái)配置swagger是否啟動(dòng)

          @Bean
          public Docket docket() {
              return new Docket(DocumentationType.SWAGGER_2)
                      .apiInfo(apiInfo())//配置Swagger信息
                      .enable(false)//配置是否啟動(dòng)swagger,默認(rèn)為true
                      .select()
                      .apis(RequestHandlerSelectors.basePackage("com.zsr.controller"))
                      .paths(PathSelectors.ant("/zsr/**"))
                      .build();
          }


          更改為false后啟動(dòng)測(cè)試一下,查看控制臺(tái),無(wú)法進(jìn)入到swagger頁(yè)面

          如果我們有這樣一個(gè)需求:希望Swagger在開發(fā)環(huán)境中,在正式環(huán)境時(shí)不能使用

          • 首先要判斷是不是開發(fā)環(huán)境,可以設(shè)置一個(gè)flag表示用來(lái)表示:flag=1即表示生產(chǎn)環(huán)境

          • 然后將flag的值傳給enable(flag)

          首先在resources目錄下新建兩種springboot配置文件:

          • 開發(fā)環(huán)境:application-dev.properties

          • server.port=8081

          • 正式環(huán)境:application-pro.properties

          • server.port=8082


          然后在主配置文件application.properties中激活開發(fā)環(huán)境

          spring.profiles.active=dev


          然后我們到SwaggerConfig中的docket()方法中添加代碼:

          • 首先給該方法傳一個(gè)參數(shù)Environment的實(shí)例

          Environment environment

          • 首先設(shè)置藥配置的Swagger環(huán)境:這里可以添加多個(gè)環(huán)境

          • Profiles profiles = Profiles.of("dev""test");

          • 然后通過(guò)environment.acceptsProfiles方法判斷是否處在上一步設(shè)定的dev/test環(huán)境中,返回一個(gè)boolean的值,我們用flag接收


          • boolean flag = environment.acceptsProfiles(profiles);

          • 然后修改enable中的參數(shù)為flag,即通過(guò)flag來(lái)判斷是否開啟Swagger

          • .enable(flag)//通過(guò)flag判斷是否開啟


          完整代碼

          @Configuration
          @EnableSwagger2//開啟Swagger2
          public class SwaggerConfig {
              //配置Swagger的Docket的bean實(shí)例
              @Bean
              public Docket docket(Environment environment) {
                  //設(shè)置要配置的Swagger環(huán)境
                  Profiles profiles = Profiles.of("dev""test");
                  //通過(guò)environment.acceptsProfiles判斷是否處在自己設(shè)定的環(huán)境中
                  boolean flag = environment.acceptsProfiles(profiles);

                  return new Docket(DocumentationType.SWAGGER_2)
                          .apiInfo(apiInfo())//配置Swagger信息
                          .enable(flag)//通過(guò)flag判斷是否開啟
                          .select()
                          .apis(RequestHandlerSelectors.basePackage("com.zsr.controller"))
                          .paths(PathSelectors.ant("/zsr/**"))
                          .build();
              }

              //配置Swagger信息
              private ApiInfo apiInfo() {
                  return new ApiInfo(
                          "Baret-H",
                          "我的Swagger API文檔",
                          "1.0",
                          "https://bareth.blog.csdn.net/",
                          new Contact("Baret-H""https://bareth.blog.csdn.net/""[email protected]"),//作者信息
                          "Apache 2.0",
                          "http://www.apache.org/licenses/LICENSE-2.0",
                          new ArrayList<VendorExtension>());
              }
          }


          然后啟動(dòng)主程序測(cè)試:由于激活了dev開發(fā)環(huán)境,所以訪問(wèn)localhost:8081/swagger-ui.html

          成功開啟swagger,如果我們修改主配置文件,激活pro正式發(fā)布環(huán)境

          spring.profiles.active=pro


          再次重啟主程序測(cè)試,訪問(wèn)端口8082對(duì)應(yīng)的地址localhost:8082/swagger-ui.html

          無(wú)法進(jìn)入,因?yàn)?/span>pro環(huán)境不在我們配置的test/dev環(huán)境中,所以無(wú)法開啟



          9. 配置API文檔分組

          1. 設(shè)置默認(rèn)組名

          可以看到,我們默認(rèn)只有一個(gè)組且組名為default

          我們可以在docket通過(guò).groupName中設(shè)置組名

          public Docket docket(Environment environment) {
              //設(shè)置要配置的Swagger環(huán)境
              Profiles profiles = Profiles.of("dev""test");
              //通過(guò)environment.acceptsProfiles判斷是否處在自己設(shè)定的環(huán)境中
              boolean flag = environment.acceptsProfiles(profiles);

              return new Docket(DocumentationType.SWAGGER_2)
                      .apiInfo(apiInfo())//配置Swagger信息
                      .groupName("zsr")
                      .enable(true)//配置是否啟動(dòng)swagger,默認(rèn)為true
                      .select()
                      .apis(RequestHandlerSelectors.basePackage("com.zsr.controller"))
                      .paths(PathSelectors.any())
                      .build();
          }


          重啟測(cè)試,可以看到組名更改為zsr


          2. 配置多個(gè)組

          上述我們成功修改了組名,但是只有一個(gè)組,如果我們想要多個(gè)組呢?

          觀察代碼可以知道,一個(gè)Docket實(shí)例就對(duì)應(yīng)著一個(gè)組,因此我們配置多個(gè)docket就對(duì)應(yīng)著多個(gè)組

          我們新增兩個(gè)Docket的bean實(shí)例

          @Bean
          public Docket docket1() {
              return new Docket(DocumentationType.SWAGGER_2).groupName("Baret-H");
          }

          @Bean
          public Docket docket2() {
              return new Docket(DocumentationType.SWAGGER_2).groupName("鐘");
          }


          再次重啟測(cè)試,就可以看到多個(gè)組并選擇



          10. 配置Model實(shí)體類

          1. 新建實(shí)體類

          在主程序同級(jí)目錄下新建pojo包,其中新建User實(shí)體類

          package com.zsr.pojo;

          public class User {
              public String username;
              public String password;
          }


          2. 編寫對(duì)應(yīng)請(qǐng)求接口

          編寫完實(shí)體類,我們?cè)趍odel中還是看不到的,我們還需在HelloController中新增一個(gè)方法返回實(shí)體類的實(shí)例對(duì)象即可映射到實(shí)體項(xiàng)中

          @GetMapping("/getUser")
          public User getUser() {
              return new User();
          }


          3. 啟動(dòng)測(cè)試

          成功顯示實(shí)體類User

          4. 常用注解

          我們可以在實(shí)體類上和其屬性上添加注解來(lái)添加對(duì)應(yīng)的注釋

          • @ApiModel為類添加注釋

          • @ApiModelProperty為類屬性添加注釋

          package com.zsr.pojo;

          import io.swagger.annotations.ApiModel;
          import io.swagger.annotations.ApiModelProperty;

          @ApiModel("用戶實(shí)體")
          public class User {
              @ApiModelProperty("用戶名")
              public String username;
              @ApiModelProperty("密碼")
              public String password;
          }


          重啟測(cè)試,即可以看到注釋信息

          我們同樣可以在Controller類和其中的方法上添加相應(yīng)的注解

          @Api(tags = "Hello控制類")
          @RestController
          public class HelloController {
              @RequestMapping("/hello")
              public String hello() {
                  return "hello";
              }

              @ApiOperation("hello控制類")
              @GetMapping("/getUser")
              public User getUser() {
                  return new User();
              }
          }


          重啟即可看到對(duì)應(yīng)的注解



          11. 測(cè)試Swagger的使用

          1. 測(cè)試傳參

          我們?cè)?/span>HelloController中新增一個(gè)方法,參數(shù)為username,可以用@ApiParam給該參數(shù)添加注解

          @GetMapping("/username")
          public String getUserName(@ApiParam("用戶名") String username) {
              return username;
          }


          重啟測(cè)試,可以看到我們添加的注釋

          我們可以簡(jiǎn)單測(cè)試一下,點(diǎn)擊Try it out;然后以json的格式輸入用戶名,然后點(diǎn)擊Execute執(zhí)行

          可以看到報(bào)錯(cuò)了,這是因?yàn)槲覀兪鞘褂玫氖?/span>Get方式:是通過(guò)URL的方式傳遞的,而不是通過(guò)請(qǐng)求體單獨(dú)傳參

          我們將代碼修改一下,將GetMapping改為PostMapping

          @PostMapping("/username")
          public String getUserName(@ApiParam("用戶名") String username) {
              return username;
          }



          再次以json的格式輸入?yún)?shù)username,可以看到成功了

          2. 測(cè)試錯(cuò)誤

          我們?cè)?/span>HelloController中新增一個(gè)方法,參數(shù)為User,可以用@ApiParam給該參數(shù)添加注解

          然后運(yùn)行測(cè)試

          找到對(duì)應(yīng)的controller,點(diǎn)擊Try it out測(cè)試,輸入用戶名和密碼然后點(diǎn)擊Excute

          可以看到我們請(qǐng)求的URL完全正確,但是Response body相應(yīng)體中用戶名和密碼都為空,這是因?yàn)槲覀兊膶?shí)體類沒(méi)有添加對(duì)應(yīng)的GET和SET方法,我們添加上去

          package com.zsr.pojo;

          import io.swagger.annotations.ApiModel;
          import io.swagger.annotations.ApiModelProperty;

          @ApiModel("用戶實(shí)體")
          public class User {
              @ApiModelProperty("用戶名")
              public String username;
              @ApiModelProperty("密碼")
              public String password;

              public String getUsername() {
                  return username;
              }

              public void setUsername(String username) {
                  this.username = username;
              }

              public String getPassword() {
                  return password;
              }

              public void setPassword(String password) {
                  this.password = password;
              }
          }


          再次啟動(dòng)測(cè)試,成功!

          如果我們修改一下代碼

          @PostMapping("/post")
          private User postUser(User user) {
              int i = 100 / 0;
              return user;
          }


          此時(shí)測(cè)試肯定會(huì)報(bào)錯(cuò),我們測(cè)試看看,可以看到500錯(cuò)誤

          由此可見,swagger可以讓我們很容易的進(jìn)行前后端的交互測(cè)試








          瀏覽 64
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  超碰2021 | 俺去也俺就去www色情网最新更新内容 | 天天摸天天日天天射 | 国产无码15p | 插插插插亚洲综合 |