一、Swagger的作用和概念
? 官方地址:https://swagger.io/
? Swagger 是一個規范且完整的框架,用于生成、描述、調用和可視化 RESTful 風格的 Web 服務以及 集成Swagger自動生成API文檔。
? Swagger 的目標是對 REST API 定義一個標準且和語言無關的接口,可以讓人和計算機擁有無須訪問源碼、文檔或網絡流量監測就可以發現和理解服務的能力。當通過 Swagger 進行正確定義,用戶可以理解遠程服務并使用最少實現邏輯與遠程服務進行交互。與為底層編程所實現的接口類似,Swagger 消除了調用服務時可能會有的猜測。
1、Swagger 的優勢
- 支持 API 自動生成同步的在線文檔:使用 Swagger 后可以直接通過代碼生成文檔,不再需要自己手動編寫接口文檔了,對程序員來說非常方便,可以節約寫文檔的時間去學習新技術。
- 提供 Web 頁面在線測試 API:光有文檔還不夠,Swagger 生成的文檔還支持在線測試。參數和格式都定好了,直接在界面上輸入參數對應的值即可在線測試接口。
2、SwaggerUI 特點
- 無依賴 UI可以在任何開發環境中使用,無論是本地還是在Web端中。
- 人性化允許最終開發人員輕松地進行交互,并嘗試API公開的每個操作,以方便使用。
- 易于瀏覽歸類整齊的文檔可快速查找并使用資源和端點。
- 所有瀏覽器支持 Swagger UI 在所有主要瀏覽器中均可使用,以適應各種可能的情況。
- 完全可定制 通過完整的源代碼訪問方式以所需方式設置和調整Swagger UI。
- 完整的OAS支持 可視化Swagger 2.0或OAS 3.0中定義的API
前后端分離:
現主流前后端開發:Vue + SpringBoot
后端時代:前端只用管理靜態頁面; html==》后端。模版引擎 JSP=>后端是主力
前后端分離時代:
- 后端:后端控制層、服務層、數據訪問層 【后端團隊】
- 前端:前端控制層、視圖層 【前端團隊】
- 偽造后端數據,json。在后端開發前數據以及存在,不需要后端,前端工程師依舊能將項目跑起來。
- 前后端如何交互?==>API
- 前后端相對獨立,松耦合;
- 前后端甚至可以部署在不同的服務器上。
產生一個問題
? 前后端集成聯調,前端人員和后端人員無法做到 “及時協商,盡早解決”,最終導致問題集中爆發;
SpringBoot中集成Swagger
解決方案:
首先指定scheme,實時更新最新的API,降低集成的風險。
早些年,制定Word計劃文檔
前后端分離:
- 前端測試后端接口使用:Postman工具。
- 后端提供接口:需要實時更新最新改動和消息。
這時Swagger很好的解決了這個問題
- 號稱世界上最流行的API框架。
- Restful API文檔在線自動生成工具 ,API文檔與API定義同步更新
- 直接運行,可以在線測試API接口。
- 支持多種語言 如:Java 、Php等高級語言
2、SpringBoot集成Swagger
1、新建一個SpringBoot-web項目
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>
3、編寫HelloController,測試確保運行成功!
@RestController public class HelloController { @RequestMapping(value = "/hello") public String Hello(){ return "Hello Swgger!"; } }
4、要使用Swagger,需要編寫一個配置類SwaggerConfig來配置 Swagger
@Configuration //配置類 @EnableSwagger2// 開啟Swagger2的自動配置 public class SwaggerConfig { }
目錄:
5、訪問測試 :http://localhost:8080/swagger-ui.html ,看到swagger的界面;
3、配置Swagger
1、Swagger實例Bean是Docket,所以通過配置Docket實例來配置Swaggger
@Configuration @EnableSwagger2 // 開啟Swagger2的自動配置 public class SwaggerConfig { //配置了Swagger的Docket的bean實例 @Bean public Docket docket(Environment environment){ return new Docket(DocumentationType.SWAGGER_2); }
2、通過apiInfo()屬性配置文檔信息(全部)
package com.kk.swagger.config; import com.kk.swagger.controller.HelloController; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import org.springframework.core.env.Profiles; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Contact; 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 { //分組 @Bean public Docket docket1(){ return new Docket(DocumentationType.SWAGGER_2).groupName("KK1"); } @Bean public Docket docket2(){ return new Docket(DocumentationType.SWAGGER_2).groupName("KK2"); } @Bean public Docket docket3(){ return new Docket(DocumentationType.SWAGGER_2).groupName("KK3"); } //配置了Swagger的Docket的bean實例 //enable 是否啟動Swagger 如果為false 則Swagger 不能再瀏覽器中訪問 @Bean public Docket docket(Environment environment){ //設置要顯示Swagger的環境 Profiles profiles=Profiles.of("dev","test"); //獲取項目的環境 通過environment.acceptsProfiles判斷是否處在自己的設定的環境當中 boolean flag = environment.acceptsProfiles(profiles); return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .groupName("kk") .enable(flag) .select() //RequestHandlerSelectors 配置要掃描接口的方式 //basePackage 指定要掃描的包 //any() 掃描全部 //none() 都不掃描 //withClassAnnotation 掃描方法上的注解 參數是一個注解的反射對象 .apis(RequestHandlerSelectors.basePackage("com.kk.swagger.controller")) // .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class)) 這個只會掃描類上有RestController的方法 // .paths() 過濾什么路徑 // .paths(PathSelectors.ant("/kk/**")) .build(); } private static final Contact DEFAULT_CONTACT =new Contact("KK","HTTP","666@qq.com"); //配置Swagger信息 apiInfo private ApiInfo apiInfo(){ return new ApiInfo("KK的SwaggerAPI文檔", "Api Documentation", "1.0", "urn:tos", DEFAULT_CONTACT, "Apache 2.0", "http://www.apache.org/licenses/LICENSE-2.0", new ArrayList()); } }
application.properties
# 應用名稱 spring.application.name=swagger-springboot # 應用服務 WEB 訪問端口 server.port=8080 spring.profiles.active=dev
application-dev.properties
server.port=8081
application-test.properties
server.port=8082
測試
4、實體配置
1、新建一個實體類
package com.kk.swagger.pojo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; //@Api(注釋) @ApiModel("用戶實體類") public class User { @ApiModelProperty("用戶名") public String username; @ApiModelProperty("密碼") public String password; }
2、只要這個實體在請求接口的返回值上(即使是泛型),都能映射到實體項中:
//只要接口中,返回值存在實體類,它就會被掃描到Swagger中 @PostMapping(value = "/user") public User user(){ return new User(); }
測試
可以給請求的接口配置一些注釋
//Operation 接口 不是放在類上的 而是放在方法上的 @ApiOperation("Hello控制類,Post測試") @PostMapping(value = "/postt") public User postt(@ApiParam("用戶名") User user){ return user; }
5、其他皮膚
導包
<!-- 換膚--> <!-- https://mvnrepository.com/artifact/com.github.xiaoymin/swagger-bootstrap-ui --> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>swagger-bootstrap-ui</artifactId> <version>1.9.6</version> </dependency>
訪問 http://localhost:8080/doc.html
還有很多,可以網上查查
nrepository.com/artifact/com.github.xiaoymin/swagger-bootstrap-ui -->
com.github.xiaoymin
swagger-bootstrap-ui
1.9.6
**訪問 http://localhost:8080/doc.html**
==還有很多,可以網上查查==
到此這篇關于Java微服務開發之Swagger詳解的文章就介紹到這了,更多相關Java Swagger內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/weixin_50569789/article/details/120683191