Swagger是一个开源项目,用于描述Restful API的工具。Swagger的依赖可以方便地使用它的多种功能,包括API描述、API测试和API文档生成。本文将从不同的角度为您介绍Swagger依赖。
一、Swagger依赖的基本用法
在使用Swagger之前,我们需要在Maven的pom.xml文件中添加相应的依赖:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
此时我们可以通过Swagger的注解来描述我们的API,例如:
@Api(description = "用户管理")
@RestController
@RequestMapping("/users")
public class UserController {
@ApiOperation(value = "添加用户", notes = "根据User对象添加用户")
@ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataType = "User")
@PostMapping("/add")
public ResponseEntity
addUser(@RequestBody User user) {
// some codes here
return ResponseEntity.ok("添加成功");
}
}
在上述代码中,我们为添加用户的接口添加了@Api和@ApiOperation注解,描述了该接口的具体信息。我们也可以使用@ApiIgnore注解来忽略一些接口或参数。
使用Swagger依赖,我们还可以生成API文档。只需在项目启动类加上@EnableSwagger2注解,并在配置文件中添加如下配置:
springfox.documentation.swagger.v2.enabled=true
在浏览器中访问“http://localhost:port/swagger-ui.html“,就可以看到生成的文档了。
二、Swagger依赖的高级用法
1、自定义接口层级
在默认情况下,Swagger会将所有接口放在一个根路径下,可以使用@Api、@ApiModel等注解来自定义接口的层级结构。例如:
@Api(tags = {"用户管理"})
@RestController
@RequestMapping("/users")
public class UserController {
@ApiOperation(value = "添加用户", notes = "根据User对象添加用户")
@ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataType = "User")
@PostMapping("/add")
public ResponseEntity
addUser(@RequestBody User user) {
// some codes here
return ResponseEntity.ok("添加成功");
}
}
使用tags属性来定义接口的所属层级,使文档更有层次感。
2、自定义文档内容
在默认情况下,Swagger生成的文档会包含一些不必要的信息,例如Swagger本身的版本号等。我们可以使用Swagger提供的swaggerConfig方法来自定义文档内容。例如:
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.api"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("API文档")
.version("1.0.0")
.description("这是我的API文档")
.build();
}
}
在上述代码中,我们通过apiInfo方法来自定义文档的标题、版本号和描述信息等。
3、自定义UI界面
除了生成文档,Swagger还提供了一个UI界面供我们查看和测试接口。这个UI界面也可以通过自定义来美化。例如:
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Autowired
private TypeResolver typeResolver;
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.api"))
.paths(PathSelectors.any())
.build()
.alternateTypeRules(new Rule(typeResolver.resolve(List.class, typeResolver.resolve(MyModel.class)),
typeResolver.resolve(List.class, typeResolver.resolve(MyModelDTO.class)), Ordered.HIGHEST_PRECEDENCE))
.directModelSubstitute(LocalDate.class, String.class)
.genericModelSubstitutes(ResponseEntity.class)
.useDefaultResponseMessages(false)
.globalResponseMessage(RequestMethod.GET, responseMessage())
.enableUrlTemplating(true)
.tags(new Tag("users", "Operations about users"))
.additionalModels(typeResolver.resolve(MyModel.class), typeResolver.resolve(MyModelDTO.class))
.enableHypermediaSupport(true)
.protocols(newHashSet("http", "https"))
.securitySchemes(newArrayList(apiKey()))
.securityContexts(newArrayList(securityContext()))
.pathProvider(new RelativePathProvider(null) {
@Override
public String getApplicationBasePath() {
return "/api";
}
})
.ignoredParameterTypes(User.class)
.globalOperationParameters(
newArrayList(new ParameterBuilder()
.name("Authorization")
.description("Bearer token")
.modelRef(new ModelRef("string"))
.parameterType("header")
.required(false)
.build()))
.directModelSubstitute(LocalDateTime.class,
String.class);
}
// some other methods and configurations here...
}
在上述代码中,我们使用一系列的参数和设置来自定义Swagger的UI界面。
三、Swagger依赖的可扩展性
Swagger依赖具有很高的可扩展性,我们可以通过实现自己的类来定制Swagger的各个功能,甚至可以添加自己的Plugin来增加一些自定义的功能。例如:
public class MyPlugin implements springfox.documentation.spi.service.OperationBuilderPlugin {
@Override
public void apply(OperationContext context) {
// some codes here
}
@Override
public boolean supports(DocumentationType delimiter) {
return delimiter == DocumentationType.SWAGGER_2;
}
}
在上述代码中,我们实现了自己的Plugin,并通过supports方法来指定我们要扩展的功能是Swagger 2。
四、总结
Swagger依赖作为一个通用的Restful API描述工具,已经被广泛地应用于各种场景,例如API文档生成、API测试等。本文从不同的角度,详细地介绍了Swagger依赖的基本用法、高级用法和可扩展性。我们希望这些介绍可以帮助您更好地使用Swagger依赖来描述和管理您的API。