Swagger笔记
Swagger
- 了解Swagger的概念及作用
- 了解前后端分离
- 在springboot中集成swagger
Swagger简介
接口文档对于前后端开发人员都十分重要。尤其近几年流行前后端分离后接口文档又变成重中之重。接口文档固然重要,但是由于项 目周期等原因后端人员经常出现无法及时更新,导致前端人员抱怨接 口文档和实际情况不一致。
很多人员会抱怨别人写的接口文档不规范,不及时更新。当时当 自己写的时候确实最烦去写接口文档。这种痛苦只有亲身经历才会牢 记于心。
如果接口文档可以实时动态生成就不会出现上面问题。
Swagger 可以完美的解决上面的问题。
Open API 规范(OpenAPI Specification)以前叫做 Swagger 规范,是REST API 的 API 描述格式。
Open API 文件允许描述整个 API,包括:
· 每个访问地址的类型。POST 或 GET。
·每个操作的参数。包括输入输出参数。
·认证方法。
·连接信息,声明,使用团队和其他信息。
Open API 规范可以使用 YAML 或 JSON 格式进行编写。这样更利于我们和机器进行阅读。
OpenAPI 规范(OAS)为 RESTful API 定义了一个与语言无关的标 准接口,允许人和计算机发现和理解服务的功能,而无需访问源代码, 文档或通过网络流量检查。正确定义后,消费者可以使用最少量的实 现逻辑来理解远程服务并与之交互。然后,文档生成工具可以使用 OpenAPI 定义来显示 API,使用各 种编程语言生成服务器和客户端的代码生成工具,测试工具以及许多 其他用例。
Swagger 是一套围绕 Open API 规范构建的开源工具,可以帮助设 计,构建,记录和使用 REST API。
Swagger 工具包括的组件:
Swagger Editor :基于浏览器编辑器,可以在里面编写 Open API规范。类似 Markdown 具有实时预览描述文件的功能。
Swagger UI:将 Open API 规范呈现为交互式 API 文档。用可视化UI 展示描述文件。
Swagger Codegen:将 OpenAPI 规范生成为服务器存根和客户端 库。通过 Swagger Codegen 可以将描述文件生成 html 格式和 cwiki 形 式的接口文档,同时也可以生成多种言语的客户端和服务端代码。
Swagger Inspector:和 Swagger UI 有点类似,但是可以返回更多 信息,也会保存请求的实际参数数据。
Swagger Hub:集成了上面所有项目的各个功能,你可以以项目 和版本为单位,将你的描述文件上传到 Swagger Hub 中。在 Swagger Hub 中可以完成上面项目的所有工作,需要注册账号,分免费版和收费版。
使用 Swagger,就是把相关的信息存储在它定义的描述文件里面(yml 或 json 格式),再通过维护这个描述文件可以去更新接口文档, 以及生成各端代码。
SpringBoot集成Swagger
SpringBoot集成Swagger => springfox,两个jar包
使用Swagger
要求:jdk 1.8 + 否则swagger2无法运行
步骤:
新建一个SpringBoot-web项目
添加Maven依赖(注意:2.9.2版本之前,之后的不行)
<!-- 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> <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency>
编写HelloController,测试Swagger
@RestController public class HelloController { @RequestMapping("/hello") public String hello(){ return "hello"; }
在配置类编写SwaggerConfig,并配置注解
@Configuration @EnableSwagger2 //开启Swagger2 public class SwaggerConfig { }
配置Swagger
- Swagger通过Docekt的bean实例实现
// 配置了Swagger的Docket的bean实例
@Bean
public Docket docket(){
return new Docket(DocumentationType.SWAGGER_2)
}
配置Swagger信息可以通过——>apiInfo
//配置Swagger信息->apiInfo private ApiInfo apiInfo(){ Contact contact = new Contact("PlutoWu", "https://www.plutowu.top/", "p1utowu@qq.com"); return new ApiInfo( "Pluto的SwaggerAPI文档", "PlutoWu Swagger", "v1.0", "https://www.plutowu.top/", contact, "Apache 2.0", "http://www.apache.org/licenses/LICENSE-2.0", new ArrayList()); }
Docekt关联apiInfo以实现Swagger-UI页面的自主化
@Bean
public Docket docket(){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo());
}
配置Swagger扫描接口
通过设置Docket下的select()实现对扫描接口的配置
@Bean public Docket docket(){ return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() // RequestHandlerSelectors,配置要扫描接口的方式 // basePackage指定要扫描的包 // any():扫描全部 // none():不扫描 // withClassAnnotation:扫描类上的注解,参数是一个注解的反射对象 // withMethodAnnotation:扫描方法上的注解 .apis(RequestHandlerSelectors.basePackage("com.pluto.swagger.controller")) // path():过滤什么路径 // .paths(PathSelectors.ant("/pluto/**")) .build(); }
现在只能扫描到controller包下的接口
以下为可选的方式包括指定接口、包以及路径
// RequestHandlerSelectors,配置要扫描接口的方式
// basePackage指定要扫描的包
// any():扫描全部
// none():不扫描
// regex(final String pathRegex):通过正则表达式控制
// ant(final String antPattern):通过ant()控制
// withClassAnnotation:扫描类上的注解,参数是一个注解的反射对象
// withMethodAnnotation:扫描方法上的注解
// path():过滤什么路径
.paths(PathSelectors.ant("/pluto/**"))
配置Swagger开关
在Docket下添加如下配置即可实现开关Swagger
@Bean public Docket docket(){ return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .enable(false) // 开关Swagger .build(); }
置于false即可看到以下页面
如何动态配置当项目处于test、dev环境时显示swagger,处于prod时不显示?
- 判断是否为生产环境 flag = false
- 注入enable (flag)
# 应用名称
spring.application.name=swagger-demo
# 应用服务 WEB 访问端口
server.port=8080
spring.profiles.active=dev
@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())
.enable(true)
.select()
.apis(RequestHandlerSelectors.basePackage("com.pluto.swagger.controller"))
.paths(PathSelectors.ant("/pluto/**"))
.build();
}
同理,配置文件更改环境为prod即可切换为发布版本,端口也要相应更改为8082。
配置API分组
- 默认分组为default,可以通过groupName()方法进行配置分组
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.groupName("Pluto") // 配置分组
.enable(true)
.select()
......
- 重启服务页面显示分组
- 配置多个分组——配置多个Docket(别忘了@Bean注解,否则无法注册为实例)
@Bean
public Docket docket1(){
return new Docket(DocumentationType.SWAGGER_2).groupName("YaYa");
}
@Bean
public Docket docket2(){
return new Docket(DocumentationType.SWAGGER_2).groupName("XiaoGuo");
}
@Bean
public Docket docket3(){
return new Docket(DocumentationType.SWAGGER_2).groupName("Lily");
}
- 重启服务,页面可见多个分组
实体配置
- 新建实体类
@ApiModel("用户实体类")
public class User {
@ApiModelProperty("用户名")
public String username;
@ApiModelProperty("密码")
public String password;
......
- 配置Controller类,添加请求接口
// 只要我们的接口中,返回值存在实体类,它就会被扫描到Swagger中
@PostMapping(value = "/user")
public User user(){
return new User();
}
- 重启服务,查看实体类被扫描
注意:并非@ApiModel让实体类被扫描,而是只要出现在接口方法的返回值上的实体类都会被扫描到,@ApiModelProperty和@ApiModel只是为实体类添加注释所用。
- @ApiModel为类添加注释
- @ApiModelProperty为类具体属性添加注释
常用Swagger注解
Swagger的所有注解定义在io.swagger.annotations包下
下面列一些经常用到的,未列举出来的可以另行查阅说明:
Swagger注解 | 简单说明 |
---|---|
@Api(tags = “xxx模块说明”) | 作用在模块类上 |
@ApiOperation(“xxx接口说明”) | 作用在接口方法上 |
@ApiModel(“xxxPOJO说明”) | 作用在模型类上:如VO、BO |
@ApiModelProperty(value = “xxx属性说明”,hidden = true) | 作用在类方法和属性上,hidden设置为true可以隐藏该属性 |
@ApiParam(“xxx参数说明”) | 作用在参数、方法和字段上,类似@ApiModelProperty |
Swagger(GET/POST)测试功能
- Controller方法前添加==@ApiOeration==注释
@ApiOperation("Post测试类")
@PostMapping(value = "/post")
public User post(@ApiParam("用户名") User user){
return user;
}
- 重启服务进入Swagger-ui界面进行测试
总结:
- 添加注释到一些较难理解的接口或属性,以便增加可读性
- 可在线测试
- API实时更新
==注意:在正式版本发布时,需关闭Swagger!!!==
- 处于安全考虑
- 节省内存
拓展(Swagger皮肤切换)
- bootstrap-ui 访问 http://localhost:8080/doc.html进入UI
<!-- 引入swagger-bootstrap-ui包 /doc.html-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>1.9.1</version>
</dependency>
- mg-ui 访问 http://localhost:8080/document.html进入UI
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!