一、Swagger簡介
Swagger是一種流行的API開發工具,它可以用來生成和管理RESTful服務的API文檔,並允許用戶通過UI界面來互動性地測試API請求和響應。Swagger提供了許多有用的功能,包括API模型的定義、文檔的生成、代碼生成、UI界面、測試、監控等。Swagger的目標是簡化API的設計、開發和維護,提升API的可讀性和可用性,增強API的開放性和互操作性。
二、Swagger的安裝和配置
Swagger可以在Java、JavaScript、Go、Python、C#等多種語言中使用,本文以Java為例介紹其安裝和配置過程。
1. Maven依賴
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
2. 開啟Swagger
在Spring Boot的主類中,添加@EnableSwagger2註解以開啟Swagger支持。
@SpringBootApplication
@EnableSwagger2
public class Application {
...
}
3. 配置Swagger
在application.properties或application.yml文件中,添加如下的Swagger配置:
swagger:
title: My API
description: My awesome API
version: 1.0.0
contact:
name: My Team
url: https://myteam.com
email: team@myteam.com
這些配置將告訴Swagger如何在API文檔中顯示標題、描述、版本、聯繫人等信息。
三、使用Swagger生成API文檔
當Swagger在Spring Boot應用程序中啟用後,可以通過訪問http://localhost:8080/swagger-ui.html來獲取Swagger UI界面和API文檔。在Swagger UI中,可以看到所有控制器和操作的列表。
1. 創建API實例
在接下來的例子中,我們將展示如何創建一個簡單的API,並將其加入到Swagger文檔中。在src/main/java/com.example.demo/controller包中,創建一個名為PersonController的類,代碼如下:
@RestController
@RequestMapping("/person")
@Api(value="人員管理接口",tags={"PersonController"})
public class PersonController {
@ApiOperation(value="獲取所有人員信息", notes="獲取所有人員信息")
@GetMapping("/")
public List getAll() {
...
}
@ApiOperation(value="根據ID獲取人員信息", notes="根據ID獲取人員信息")
@ApiImplicitParam(name = "id", value = "人員ID", required = true, dataType = "Long", paramType = "path")
@GetMapping("/{id}")
public Person getById(@PathVariable long id) {
...
}
@ApiOperation(value="添加人員信息", notes="添加人員信息")
@PostMapping("/")
public void add(@RequestBody Person person) {
...
}
@ApiOperation(value="更新人員信息", notes="更新人員信息")
@ApiImplicitParam(name = "id", value = "人員ID", required = true, dataType = "Long", paramType = "path")
@PutMapping("/{id}")
public void update(@PathVariable long id, @RequestBody Person person) {
...
}
@ApiOperation(value="刪除人員信息", notes="刪除人員信息")
@ApiImplicitParam(name = "id", value = "人員ID", required = true, dataType = "Long", paramType = "path")
@DeleteMapping("/{id}")
public void delete(@PathVariable long id) {
...
}
}
在上面的代碼中,我們使用了@RestController註解來聲明控制器,並使用@RequestMapping註解來定義控制器的路徑。我們還使用了@Api註解來為控制器定義一個名稱和一組標記。方法部分使用了@ApiOperation、@ApiImplicitParam等註解,來定義每個操作的名稱、說明、輸入、輸出等。這些註解將使Swagger API文檔具有更多的描述、關聯和結構。
2. 訪問Swagger UI界面
現在,我們已經創建了一個簡單的API,並為其添加了Swagger註解,接下來我們可以訪問http://localhost:8080/swagger-ui.html並查看生成的API文檔。在Swagger UI中,可以看到PersonController的相關操作,包括獲取所有人員信息、根據ID獲取人員信息、添加人員信息、更新人員信息和刪除人員信息。
3. 使用Swagger測試API
我們可以使用Swagger UI界面來測試創建的API。在Swagger UI中,點擊一個操作名稱,展開該操作的詳情。在其中,我們可以填寫測試請求參數、指定請求頭、查看響應結果等。
例如,我們可以在獲取所有人員信息的操作中,點擊“Try it out”按鈕,在“Response Body”中查看響應結果。
[
{
"id": 1,
"name": "Alice",
"age": 20
},
{
"id": 2,
"name": "Bob",
"age": 30
},
{
"id": 3,
"name": "Charlie",
"age": 40
}
]
4. 下載API代碼
Swagger還可以生成API的代碼和客戶端庫。在Swagger UI中,點擊右上角的“Generate Client”按鈕,在彈出的對話框中選擇要生成的代碼語言、設置輸出目錄和選項等,點擊“Generate”按鈕,Swagger將為您生成代碼和客戶端庫。
四、Swagger的高級用法
1. 支持OAuth2.0認證
Swagger可以通過OAuth2.0認證方式來保護API,以避免未經授權的訪問。在Spring Security配置中,可以通過@EnableOAuth2註解啟用OAuth2認證,然後在Swagger配置中添加認證的相關參數,如下所示:
@Configuration
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.securitySchemes(Arrays.asList(securityScheme()))
.securityContexts(Arrays.asList(securityContext()))
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.demo.controller"))
.paths(PathSelectors.any())
.build()
.apiInfo(apiInfo());
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("My API")
.description("My awesome API")
.version("1.0.0")
.contact(new Contact("My Team", "https://myteam.com", "team@myteam.com"))
.build();
}
private SecurityScheme securityScheme() {
GrantType grantType = new AuthorizationCodeGrantBuilder()
.tokenEndpoint(new TokenEndpointBuilder().url("http://localhost:8080/oauth/token").build())
.tokenRequestEndpoint(
new TokenRequestEndpointBuilder().url("http://localhost:8080/oauth/authorize").build())
.build();
SecurityScheme oauth = new OAuthBuilder().name("spring_oauth")
.grantTypes(Arrays.asList(grantType))
.scopes(Arrays.asList(scopes()))
.build();
return oauth;
}
private SecurityContext securityContext() {
return SecurityContext.builder()
.securityReferences(Arrays.asList(new SecurityReference("spring_oauth", scopes()))).forPaths(PathSelectors.any())
.build();
}
private AuthorizationScope[] scopes() {
AuthorizationScope[] scopes = {
new AuthorizationScope("read", "for read operations"),
new AuthorizationScope("write", "for write operations") };
return scopes;
}
}
2. 支持多國語言
Swagger可以用來生成多國語言的API文檔。在Swagger配置中,可以添加參數包含多國語言文本,例如:
@Configuration
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.demo.controller"))
.paths(PathSelectors.any())
.build()
.apiInfo(apiInfo());
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("My API")
.description("My awesome API")
.version("1.0.0")
.contact(new Contact("My Team", "https://myteam.com", "team@myteam.com"))
.termsOfServiceUrl("https://myteam.com/terms")
.license("Apache 2.0")
.licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html")
.extensions(Collections.singletonList(new StringVendorExtension("language", "en")))
.build();
}
}
3. 支持上傳下載文件
Swagger支持在API中上傳下載文件。在操作參數中,使用@ApiParam註解來定義文件上傳參數類型:
@ApiOperation(value="上傳文件", notes="上傳文件")
@PostMapping("/upload")
public void upload(@RequestParam("file") @ApiParam(name = "file", value = "上傳的文件") MultipartFile file) {
...
}
@ApiOperation(value="下載文件", notes="下載文件")
@PostMapping("/download")
public void download(@RequestParam("path") @ApiParam(name = "path", value = "文件路徑") String path, HttpServletResponse response) {
...
}
4. 支持API版本控制
Swagger支持對API進行版本控制。在配置中,指定API的版本號即可:
@Configuration
@EnableSwagger2
public class SwaggerConfig {
private static final String[] PRODUCES_AND_CONSUMES = { MediaType.APPLICATION_JSON_VALUE };
@Bean
public Docket apiV1() {
return new Docket(DocumentationType.SWAGGER_2)
.groupName("v1")
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.demo.controller"))
.paths(PathSelectors.ant("/v1/**"))
.build()
.apiInfo(apiInfo())
.produces(Arrays.asList(PRODUCES_AND_CONSUMES))
.consumes(Arrays.asList(PRODUCES_AND_CONSUMES));
}
@Bean
public Docket apiV2() {
return new Docket(DocumentationType.SWAGGER_2)
.groupName("v2")
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.demo.controller"))
.paths(PathSelectors.ant("/v2/**"))
.build()
.apiInfo(apiInfo())
.produces(Arrays.asList(PRODUCES_AND_CONSUMES))
.consumes(Arrays.asList(PRODUCES_AND_CONSUMES));
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("My API")
.description("My awesome API")
.version("1.0.0")
.contact(new Contact("My Team", "https://myteam.com", "team@myteam.com"))
.build();
}
}
5. 支持分組管理API
Swagger支持將API分組管理。在配置中,使用Docket的groupName來指定API所屬分組,例如:
@Configuration
@EnableSwagger2
public class SwaggerConfig {private static final String[] PRODUCES_AND_CONSUMES = { MediaType.APPLICATION_JSON_VALUE };
@Bean
public Docket apiA() {
return new Docket(DocumentationType.SWAGGER_2)
.groupName("Group A")
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.demo.controller.a"))
.paths(PathSelectors.any())
.build()
.apiInfo(apiInfo())
.produces(Arrays.asList(PRODUCES_AND_CONSUMES))
.consumes(Arrays.asList(PRODUCES_AND_CONSUMES));
}@Bean
public Docket apiB() {
return new Docket(DocumentationType.SWAGGER_2)
.groupName("Group B")
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.demo.controller.b"))
.paths(PathSelectors.any())
.build()
.apiInfo(apiInfo())
.produces(Arrays.asList(PRODUCES_AND_CONSUMES))
.consumes(Arrays.asList(PRODUCES_AND_CONSUMES));
}private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("My API")
.description("My awesome API")原創文章,作者:ONMSR,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/361680.html
微信掃一掃
支付寶掃一掃