一、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 ListgetAll() { ... } @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")