Swagger簡介及在SpringBoot中使用swagger
首先給出學習的視訊傳送門:https://www.bilibili.com/video/BV1Y441197Lw
Swagger
學習目標:
-
-
瞭解前後端分離
-
在SpringBoot中整合Swagger
Swagger簡介
前後端分離 主流搭配:Vue + SpringBoot
後端時代: 前端只用管理靜態頁面;html==>後端。模板引擎 JSP => 後端主力
前後端分離時代:
-
後端:控制層、服務層、資料訪問層
-
前端:前端控制層、檢視層 (偽造後端資料 ---json)
-
前端如何跑起來? ====> API
-
前後端相對獨立,鬆耦合
-
前後端甚至可以部署在不同的伺服器上;
產生問題:
-
前後端整合聯調,前端人員和後端人員無法做到 ”及時協商,今早解決“,最終導致問題集中爆發
解決方案:
-
首先指定 schema [計劃提綱] ,實時更新最新API ,降低整合的風險
-
早些年:制定word 計劃文件;
-
前後端分離:
-
前端測試後端介面:postman
-
後端提供介面,需要實時更新最新的訊息及改動
-
Swagger
-
號稱世界上最流行的Api 框架
-
RestFul Api 文件線上自動生成工具 =>Api文件與APi定義同步更新
-
直接執行,可以線上測試Api 介面
-
支援多語言: (java \ php ...)
在專案中使用Swagger需要 匯入依賴 springfox-swagger2 、springfox-swagger-ui
-
swagger2
-
ui
SpringBoot整合Swagger
1、新建一個springboot 的 web專案
2、匯入相關依賴
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>3.0.0</version> </dependency> <!-- 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、編寫一個Hello的Get 介面
@Configuration @EnableSwagger2 //開啟swagger2 public class SwaggerConfig { //配置swagger 的docket的bean例項 @Bean public Docket docket(){ return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()); } //配置swagger資訊 =apiInfo private ApiInfo apiInfo(){ //作者資訊 Contact contact=new Contact("路上", "http://localhost:8080/hello", "[email protected]"); return new ApiInfo("路上的Swagger API文件", "描述。。。", "版本1.0", "http://localhost:8080/hello", contact, "Apache 2.0", "http://www.apache.org/licenses/LICENSE-2.0", new ArrayList()); } }
5、測試執行:http://localhost:8080/swagger-ui.html
Swagger配置掃描介面
Docket.select ()
@Bean public Docket docket(){ return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() //RequestHandlerSelectors ,配置要掃描介面的方式 //basePackage :指定要掃描的包 .apis(RequestHandlerSelectors.basePackage("com.example.swagger2.controller")) //ang :掃描全部 .apis(RequestHandlerSelectors.any()) //none :都不掃描 .apis(RequestHandlerSelectors.none()) //withClassAnnotation :掃描類上的註解 .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class)) //withMethodAnnotation :掃描方法上的註解 .apis(RequestHandlerSelectors.withMethodAnnotation(GetMapping.class)) //paths() 過濾什麼路徑 .paths(PathSelectors.ant("/**")) .build(); }
@Bean public Docket docket(){ return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) //是否啟用swagger ,如果為false,則swagger不能在瀏覽器中訪問 .enable(true) .select() .paths(PathSelectors.ant("/**")) .build(); }
問題: 怎樣設定Swagger在生產環境中使用,在釋出的時候不使用?
-
判斷是否生產環境 flag=false
-
注入 enable (flag)
1、新建application-dev.properties和application-pro.properties
2、分別在這兩個檔案中加入server.port=8000和server.port=8080
3、在application.properties中寫上spring.profiles.active=dev
4、在docket() 中獲取環境是否dev環境
@Bean public Docket docket(Environment env){//加入Environment來獲取配置中的東西 //設定要顯示的swagger 環境 Profiles profiles=Profiles.of("dev"); //通過environment.acceptsProfiles判斷是否在自己設定的環境當中 boolean flag=env.acceptsProfiles(profiles); return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .enable(flag) .select() .paths(PathSelectors.ant("/**")) .build(); }
配置APi的分組
.groupName("路上")
如何配置對個分組--->多個Docket例項即可
@Bean public Docket docket1(){ return new Docket(DocumentationType.SWAGGER_2).groupName("A"); } @Bean public Docket docket2(){ return new Docket(DocumentationType.SWAGGER_2).groupName("B"); } @Bean public Docket docket3(){ return new Docket(DocumentationType.SWAGGER_2).groupName("C"); }
實體類的註解
@ApiModel("使用者實體類 User") //實體類註釋 public class User { @ApiModelProperty("使用者名稱") //實體類欄位註釋 public String username; @ApiModelProperty("密碼") public String password; }
控制類的註解
//Api 介面註釋 @Api(tags="hello控制類") @RestController public class HelloController { @GetMapping("/hello") public String hello(){ return "hello,lushang"; } //ApiOperation介面註釋 @ApiOperation("hello介面2") @GetMapping("/hello2") public String hello2(@ApiParam("使用者名稱") String username){ return "hello2"; } //只要我們的介面中,返回值中存在實體類,他就會被掃描到 swagger 中 @ApiOperation("post測試") @PostMapping("/user") public User user(@ApiParam("使用者名稱+密碼") User user){ return user; } }
總結:
-
我們可以通過Swagger給一些比較難理解的屬性或者介面,增加註解資訊
-
介面文件實時更新
-
可以線上測試
【注意點】 在正式釋出的時候,關閉Swagger~出於安全考慮。而且節省記憶體