1.Swagger简介
前端和后端的联调离不开API文档,而手动编写API文档是一项耗时又费力的操作。Swagger正是基于简化API文档的输出的一个优秀的开源框架,通过OpenAPI的规范呈现接口信息,方便的提供测试和联调。这样,如果按照新的开发模式,在开发新版本或者迭代版本的时候,只需要更新Swagger描述文件,就可以自动生成接口文档和客户端服务端代码,做到调用端代码、服务端代码以及接口文档的一致性。
官方地址:
代码语言:javascript复制https://swagger.io
2.Springboot集成Swagger2及常见配置
第一步:添加依赖
代码语言:javascript复制<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.9.2的版本是用的最多的,具体的可以直接去maven的官网去搜索,找一个使用量最多的版本即可。
第二步:配置
新建config包,创建SwaggerConfig类
代码语言:javascript复制@EnableSwagger2
@Configuration
public class Swagger2Config {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
//为当前包路径,控制器类包
.apis(RequestHandlerSelectors.basePackage("com.fdd.controller"))
.paths(PathSelectors.any())
.build();
}
//构建 api文档的详细信息函数
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
//页面标题
.title("XX平台API接口文档")
//创建人
.contact(new Contact("test", "http://www.test.cc",
"XXX@qq.com"))
//版本号
.version("1.0")
//描述
.description("系统API描述")
.build();
}
这里的配置也比较简单。这里有很多选项供我们去配置。如果我们的项目有多个组,只需要创建多个Docket即可。这时候扫描的包换成每个组的包路径。
第三步:controller类中配置
新建一个controller包,然后创建HelloController类
代码语言:javascript复制@Api("Hello控制类")
@RestController
public class HelloController {
@GetMapping(value = "/user")
public User getUser(){
return new User("愚公要移山","123456");
}
@ApiOperation("可以指定参数的API")
@PostMapping("/param")
public String hello2(@ApiParam("用户名") String name){
return "hello" name;
}
}
这里我们可以看出,使用注解就可以对这个类、方法、字段等等进行解释说明。其他的字段还有很多,在使用的时候会有相应的提示,可以自己试一遍:
3.常用注解
@Api 标识一个java类型是文档类,用controller类的类名上
@ApiModel 表示一个实体类/模型文档,用在类名上;
@ApiModelProperty 作用在属性上,添加属性描述;
@ApiOperation 作用在接口类的方法上,控制方法的相关描述;
@ApiImplicitParam 作用在接口方法上,描述单个参数信息,只能作用在方法上;
@ApiImplicitParams 作用在接口方法上,@ApiImplicitParam参数组;
@ApiParam 作用在接口方法上,描述单个参数信息,属性基本与@ApiImplicitParam一样,但可以作用在方法、参数、属性上;
下面分别对每个注解的常用参数作讲解。
@Api:
value:字符串,对controller类的作用描述,代替原来的description(已过时),一般用此属性;
tags:字符串数组,标签组,同样可以描述controller的作用;
@ApiModel
value:字符串,模型的简短别名,使得在文档的导航中便于识别;
description:字符串,模型的附加描述;
@ApiOperation
value:字符串,方法的功能描述;
tags:字符串数组,标签组,同样可以描述方法的作用;
response:ClassType,显示指出返回的对象类型;在响应示例中会显示出改对象的字段以及示例、描述;
code:响应代码,默认200,一般不改;
@ApiModelProperty
value:字符串,字段描述;
required:boolean;指定参数是否必须,默认false;
example:字符串,参数值的示例
@ApiImplicitParam
name:字符串,参数名;
value:字符串,参数描述;
defaultValue:字符串,参数默认值;
required:boolean,标识是否必须传值,默认false;
dataType:字符串,参数类型,可以是某个类名,也可以是基本数据类型的引用类名,如Integer;
example:字符串,参数值示例;
@ApiImplicitParams
value:@ApiImplicitParam类型数组,当方法有多个@ApiImplicitParam参数时,需要放到@ApiImplicitParams注解中
@ApiParam
name:字符串,参数名;
value:字符串,参数描述;
defaultValue:字符串,设置默认值;
required:boolean,是否必须,默认false;
example:字符串,参数值示例;
4.替换swagger-ui,选择款神器—knife4j
首先我们来看下界面功能的对比,swagger-ui界面如下:
访问地址:
代码语言:javascript复制http://localhost:8080/swagger-ui
knife4j界面如下:
访问地址:
代码语言:javascript复制http://localhost:8080/doc.html
从以上可以看出knife4j界面相比swagger-ui界面更加美观,功能更加全面,除了测试相关功能外,还提供了相应的文档管理,很方便的输出不同格式的API文档,极大的方便了接口文档的输出。
5.knife4j的使用
Knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名kni4j是希望她能像一把匕首一样小巧,轻量,并且功能强悍!
Knife4j的前身是swagger-bootstrap-ui
,为了契合微服务的架构发展,由于原来swagger-bootstrap-ui
采用的是后端Java代码 前端Ui混合打包的方式,在微服务架构下显的很臃肿,因此项目正式更名为knife4j
更名后主要专注的方面
- 前后端Java代码以及前端Ui模块进行分离,在微服务架构下使用更加灵活
- 提供专注于Swagger的增强解决方案,不同于只是改善增强前端Ui部分
5.1 项目模块
目前主要的模块包括:
模块名称 | 说明 |
---|---|
knife4j | 为Java MVC框架集成Swagger的增强解决方案 |
knife4j-admin | 云端Swagger接口文档注册管理中心,集成gateway网关对任意微服务文档进行组合集成 |
knife4j-extension | chrome浏览器的增强swagger接口文档ui,快速渲染swagger资源 |
knife4j-service | 为swagger服务的一系列接口服务程序 |
knife4j-front | knife4j-spring-ui的纯前端静态版本,用于集成非Java语言使用 |
swagger-bootstrap-ui | knife4j的前身,最后发布版本是1.9.6 |
5.2 业务场景
不使用增强功能,纯粹换一个swagger的前端皮肤
不使用增强功能,纯粹换一个swagger的前端皮肤,这种情况是最简单的,你项目结构下无需变更
可以直接引用swagger-bootstrap-ui的最后一个版本1.9.6或者使用knife4j-spring-ui
老版本引用
代码语言:javascript复制<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>1.9.6</version>
</dependency>
新版本引用
代码语言:javascript复制<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-ui</artifactId>
<version>${lastVersion}</version>
</dependency>
5.3 Spring Boot项目单体架构使用增强功能
在Spring Boot单体架构下,knife4j提供了starter供开发者快速使用
代码语言:javascript复制<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
该包会引用所有的knife4j提供的资源,包括前端Ui的jar包
5.4 Spring Cloud微服务架构
在Spring Cloud的微服务架构下,每个微服务其实并不需要引入前端的Ui资源,因此在每个微服务的Spring Boot项目下,引入knife4j提供的微服务starter
代码语言:javascript复制<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-micro-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
在网关聚合文档服务下,可以再把前端的ui资源引入
代码语言:javascript复制<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
5.5 另外说明
不管是knife4j还是swagger-bootstrap-ui
对外提供的地址依然是doc.html
代码语言:javascript复制访问:http://ip:port/doc.html