什么是swagger,一篇带你入门
一、前言
在前后端分离开发的过程中,前端和后端需要进行api对接进行交互,就需要一个api规范文档,方便前后端的交互,但api文档不能根据代码的变化发生实时动态的改变,这样后端修改了接口,前端不能及时获取最新的接口,导致调用出错,需要手动维护api文档,加大了开发的工作量和困难,而swagger的出现就是为了解决这一系列的问题。
二、swagger的概述
swagger是一套基于OpenAPI规范构建的开源工具,使用RestApi
1、代码变,文档变
2、跨语言,支持多种语言
3、swagger-ui 呈现出来的是一份可交互式的API文档,可以直接在文档页面尝试API的调用
4、可以将文档规范导入相关工具(postman、soapui),这些工具将会为我们自动地创建自动化测试
补充:
RestApi格式是根据请求的方式决定本次请求的一个操作,譬如:get-->读,post-->写(增、删、改),put-->修改,delete-->删除
OpenApi与语言无关,只是一种规范,可以使用yaml和json格式进行编写,这样更利于我们和机器进行阅读
swagger主要包含了以下三个部分:
- swagger editor:基于浏览器的编辑器,我们可以使用它编写我们OpenApi规范(yaml或者json配置)
- Swagger UI:他会将我们编写的OpenApi规范呈现为交互式的API文档,后文我将使用浏览器来查看并且操作我们的RestApi
- Swagger Codegen:它可以通过OpenApi规范定义的任何API生成服务器存根和客户端SDK来简化构建过程
使用swagger就是把相关信息存储在它定义的描述文件里面(yml或json格式),再通过维护这个描述文件可以去更新接口文档,以及生成各端代码
三、springfox概述
使用swagger时如果碰见版本更新迭代时,只需要更改swagger的描述文件即可,但是在频繁的更新项目版本时很多开发人员认为即使修改描述文件(yml或json文件)也是一定的工作负担,久而久之就直接修改代码,而不去修改描述文件了,这样基于描述文件生成接口文档也失去了意义。
Marty Pitt编写了一个基于spring的组件swagger-springmvc
,Spring-fox就是根据这个组件发展而来的全新项目;
Spring-fox是根据代码生成接口文档,所以正常的进行更新项目版本,修改代码即可,而不需要跟随修改描述文件(yml或json文件);
spring-fox利用自身AOP特性,把swagger集成进来,底层还是Swagger,但是使用起来却方便很多,所以在实际开发中,都是直接使用spring-fox。
四、swagger的使用
1、新建springboot项目
2、导入相关依赖
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<!-- 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>
3、启动类中添加@EnableSwagger2
注解
@enableSwagger2:是springfox提供的一个注解,代表swagger2相关技术开启,会扫描当前类所在包,以及子包中所有的类型中的注解,做swagger文档的定值
4、编写一个简单api接口
@RestController
public class HelloController {
@GetMapping("/get")
public String get() {
return "get";
}
@PostMapping("/post")
public String post() {
return "post";
}
@RequestMapping("/hello")
public String hello() {
return "hello";
}
}
5、启动项目,并在浏览器输入http://localhost:8080/swagger-ui.html
进行swagger-ui界面访问
4.1 swagger的基础信息配置-->config类
@Configuration
@EnableSwagger2 //开启swagger2,若启动类上添加了该注解,则配置类可以不添加
public class SwaggerConfig {
// 创建swagger bean
@Bean
public Docket docket() {
// Docket是swagger全局配置对象
// DocumentationType:指定文档类型为swagger2
return new Docket(DocumentationType.SWAGGER_2)
// swagger信息
.apiInfo(apiInfo());
}
// swagger文档信息
public ApiInfo apiInfo() {
// 作者信息
Contact contact = new Contact(
// 文档发布者的名称
"iqiuq",
// 文档发布者的网站地址
"https://iqiuq.gitee.io/qiuqblogs/",
// 文档发布者的电子邮箱
"qiuyonghui258@163.com"
);
return new ApiInfo(
// 标题
"iqiuq swagger api",
// 文档描述
"演好自己人生的剧本",
// 版本号
"1.0",
// 服务组url地址
"urn:tos",
// 作者信息
contact,
// 开源组织
"Apache 2.0",
// 开源地址
"http://www.apache.org/licenses/LICENSE-2.0",
// 集合
new ArrayList()
);
}
}
4.2 swagger扫描包配置
@Configuration
@EnableSwagger2 //开启swagger2
public class SwaggerConfig {
// 创建swagger bean
@Bean
public Docket docket() {
return new Docket(DocumentationType.SWAGGER_2)
// swagger信息
.apiInfo(apiInfo())
// swagger 扫描包配置
// select()获取Docket中的选择器,返回ApiSelectorBuilder构造选择器,如扫描扫描包的注解
.select()
/**
* requestHandlerSelectors:请求处理选择器
* basePackage():扫描指定包下的所有接口
* any():扫描所有的包
* none():不扫描
* withClassAnnotation():扫描指定类上的注解,参数是一个注解的放射对象
* withMethodAnnotation():扫描方法上的注解
*/
// 指定扫描器扫描的规则(断言)
.apis(RequestHandlerSelectors.basePackage("com.iqiuq.swaggerdemo.controller"))
/**
* pathSelectors:路径选择器,过滤路径
* ang():选择所有路径
* none():都不选择
* ant():选择指定路径
* regex():正则表达式
*/
.paths(PathSelectors.regex("/hello"))
.build();
}
return new ApiInfo(
// 标题
"iqiuq swagger api",
// 文档描述
"演好自己人生的剧本",
// 版本号
"1.0",
// 服务组url地址
"urn:tos",
// 作者信息
contact,
// 开源组织
"Apache 2.0",
// 开源地址
"http://www.apache.org/licenses/LICENSE-2.0",
// 集合
new ArrayList()
);
}
4.3 配置是否开启swagger
@Configuration
@EnableSwagger2 //开启swagger2
public class SwaggerConfig {
// 创建swagger bean
@Bean
public Docket docket() {
return new Docket(DocumentationType.SWAGGER_2)
// swagger信息
.apiInfo(apiInfo())
// 配置是否开启swagger,若为false,则浏览器不能访问
.enable(false);
}
// swagger文档信息
public ApiInfo apiInfo() {
// 作者信息
Contact contact = new Contact(
"iqiuq",
"https://iqiuq.gitee.io/qiuqblogs/",
"qiuyonghui258@163.com");
return new ApiInfo(
"iqiuq swagger api",
"演好自己人生的剧本",
"1.0",
"urn:tos", contact,
"Apache 2.0",
"http://www.apache.org/licenses/LICENSE-2.0",
new ArrayList());
}
}
需求:开发和测试环境中开启swagger,其他环境不开启
@Configuration
@EnableSwagger2 //开启swagger2
public class SwaggerConfig {
// 创建swagger bean
@Bean
public Docket docket(Environment environment) {
// 配置swagger的docket的bean实例
Profiles profiles = Profiles.of("dev","test");
// 通过environment.acceptsProfiles()判断是否指定的环境中,是,则为true
boolean flag = environment.acceptsProfiles(profiles);
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.enable(flag)
.select()
.apis(RequestHandlerSelectors.basePackage("com.iqiuq.swaggerdemo.controller"))
.paths(PathSelectors.regex("/hello"))
.build();
}
// swagger文档信息
public ApiInfo apiInfo() {
Contact contact = new Contact(
"iqiuq",
"https://iqiuq.gitee.io/qiuqblogs/",
"qiuyonghui258@163.com");
return new ApiInfo(
"iqiuq swagger api",
"演好自己人生的剧本",
"1.0",
"urn:tos",
contact,
"Apache 2.0",
"http://www.apache.org/licenses/LICENSE-2.0",
new ArrayList());
}
}
4.3 swagger分组配置
每个组就是一个docket实例,多个组就是创建多个docket的实例
@Configuration
@EnableSwagger2 //开启swagger2
public class SwaggerConfig {
// 创建swagger bean
@Bean
public Docket docket1(Environment environment) {
// 配置swagger的docket的bean实例
Profiles profiles = Profiles.of("dev","test");
// 通过environment.acceptsProfiles()判断是否指定的环境中,是,则为true
boolean flag = environment.acceptsProfiles(profiles);
return new Docket(DocumentationType.SWAGGER_2)
// swagger信息
.apiInfo(apiInfo())
// 配置是否开启swagger,若为false,则浏览器不能访问
.enable(flag)
// 配置组名
.groupName("iqiuq")
.select()
.apis(RequestHandlerSelectors.basePackage("com.iqiuq.swaggerdemo.controller"))
.paths(PathSelectors.regex("/hello"))
.build();
}
@Bean
public Docket docket2(Environment environment) {
Profiles profiles = Profiles.of("dev","test");
boolean flag = environment.acceptsProfiles(profiles);
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.enable(flag)
.groupName("哈哈哈")
.select()
.apis(RequestHandlerSelectors.basePackage("com.iqiuq.swaggerdemo.controller"))
.paths(PathSelectors.regex("/hello"))
.build();
}
@Bean
public Docket docket3(Environment environment) {
Profiles profiles = Profiles.of("dev","test");
boolean flag = environment.acceptsProfiles(profiles);
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.enable(flag)
.groupName("嘻嘻嘻")
.select()
.apis(RequestHandlerSelectors.basePackage("com.iqiuq.swaggerdemo.controller"))
.paths(PathSelectors.regex("/hello"))
.build();
}
// swagger文档信息
public ApiInfo apiInfo() {
Contact contact = new Contact(
"iqiuq",
"https://iqiuq.gitee.io/qiuqblogs/",
"qiuyonghui258@163.com");
return new ApiInfo(
"iqiuq swagger api",
"演好自己人生的剧本",
"1.0",
"urn:tos",
contact,
"Apache 2.0",
"http://www.apache.org/licenses/LICENSE-2.0",
new ArrayList());
}
注意:
如果你使用的是swagger 3.0 你就需要使用
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>3.0.0</version>
</dependency>
访问:http://localhost:8080/swagger-ui/index.html 就可以实现swagger-ui.html的访问
五、swagger常用注解
swagger注解主要是用来给swagger生成的接口文档说明用的
5.1 @Api
- @Api:是类上注解,控制整个类生成接口信息的内容
- tags:类的名称,可以有多个值,多个值表示多个副本,在UI视图中就显示几个控制器访问菜单
- description:描述,已过时
5.2 @ApiOperation
- @ApiOperation:方法的说明,value值必须提供
- value:说明方法的作用
- notes:方法的备注说明
5.3 @ApiParam
- @ApiParam:可以作用于方法参数和成员变量
- name:参数别名
- value:参数的描述
- required:是否必须需要
5.4 @ApiIgnore
- @Apilgnore:忽略,当前注解描述的方法或类型,不生成api文档
5.5 @ApiImplicitParam和@ApiImplicitParams
- @ApiImplicitParam:使用在方法上,描述方法的单个参数
- name:参数名称
- value:描述
- required:是否必要参数
- paramType:参数类型
- dataType:数据类型
- @ApiImplicitParams:使用在方法上,描述方法的一组参数
- value:是@ApiImplicitParam类型的数组
- value:是@ApiImplicitParam类型的数组
5.6 @ApiModel和@ApiModelProperty
- @ApiModel:描述一个实体类型,这个实体类型如果成为任何一个生成api帮助文档方法的一个返回值类型的时候,此注解被解析
- value:自定义实体
- description:详细描述
- @ApiModelProperty:实体类属性描述
- name:字段别名
- value:字段描述
- required:是否是必须字段
- example:示例数据
- hidden:是否隐藏数据
5.7 @ApiResponse和@ApiResponses
@ApiResponses、@ApiResponse方法返回值的说明
- @ApiResponses:方法返回对象的说明
- @ApiResponse:每个参数的说明
- code:数字,例如:300
- message:信息,例如:”请求参数没填好"
- response:抛出异常的类
5.8 其他注解
- @Authorization:声明要在资源或操作上使用的授权方案
- @AuthorizationScope:描述OAuth2授权范围
- @ResponseHeader:表示可以作为响应的一部分提供的标头
- @ApiProperty:描述POJO对象中的属性值
- @ApiError:接口错误所返回的信息
六、总结
- 我们可以通过swagger给一些比较难理解的属性或接口,增加注释信息
- 接口文档实时更新
- 可以在线测试
- 在正式发布的时候,关闭swagger,出于安全考虑,而且节省内存
什么是swagger,一篇带你入门的更多相关文章
- ThreadLocal全面解析,一篇带你入门
===================== 大厂面试题: 1.Java中的引用类型有哪几种? 2.每种引用类型的特点是什么? 3.每种引用类型的应用场景是什么? 4.ThreadLocal你了解吗 5 ...
- 可能是史上最强大的js图表库——ECharts带你入门
PS:之前的那篇博客Highcharts——让你的网页上图表画的飞起 ,评论中,花儿笑弯了腰 和 StanZhai 两位仁兄让我试试 ECharts ,去主页看到<Why ECharts ?&g ...
- 史上最强大的js图表库——ECharts带你入门(转)
出处:http://www.cnblogs.com/zrtqsk/p/4019412.html PS:之前的那篇博客Highcharts——让你的网页上图表画的飞起 ,评论中,花儿笑弯了腰 和 Sta ...
- net core体系-web应用程序-4net core2.0大白话带你入门-1目录
asp.net core2.0大白话带你入门 本系列包括: 1.新建asp.net core项目2.web项目目录解读3.配置访问地址4.环境变量详解5.配置文件6.日志7.DI容器8.服务的生命周期 ...
- Python之路,第一篇:Python入门与基础
第一篇:Python入门与基础 1,什么是python? Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. 2,python的特征: (1)易于学习,易于利用: (2)开 ...
- 带你入门SpringCloud统一配置 | SpringCloud Config
前言 在微服务中众多服务的配置必然会出现相同的配置,如果配置发生变化需要修改,一个个去修改然后重启项目的方案是绝对不可取的.而 SpringCloud Config 就是一个可以帮助你实现统一配置选择 ...
- Springfox与SpringDoc——swagger如何选择(SpringDoc入门)
本文分享自天翼云开发者社区@<Springfox与SpringDoc--swagger如何选择(SpringDoc入门)>,作者: 才开始学技术的小白 0.引言 之前写过一篇关于swagg ...
- 推荐csdn里的几篇activiti基础入门及提高的博客
昨天有个网友加qq询问我有没有非maven搭建的activiti项目的demo,因为我博客中写了一个用maven,我当时没有,于是晚上回家尝试了一下,结果比较容易就实现了. 之后和那个网友聊了一下,他 ...
- RabbitMQ学习总结 第二篇:快速入门HelloWorld
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
- C#单元测试,带你入门
注:本文示例环境 VS2017 XUnit 2.2.0 单元测试框架 xunit.runner.visualstudio 2.2.0 测试运行工具 Moq 4.7.10 模拟框架 为什么要编写单元测试 ...
随机推荐
- Java中使用Callable和FutureTask创建多线程的基本用法
我们先定义一个Callable任务MyCallableTask: 步骤1:创建Callable实现类,并实现call()接口 package cn.cetc;//包名可自定义 import java. ...
- 鸿蒙ArkUI-X简介
ArkUI是一套构建分布式应用的声明式UI开发框架.它具备简洁自然的UI信息语法.丰富的UI组件.多维的状态管理,以及实时界面预览等相关能力,帮助您提升应用开发效率,并能在多种设备上实现生动而流畅的用 ...
- asp.net core中,使用CancellationToken在用户终止请求时取消所有异步操作+ abp中的设计
如果一个Controller.Action里的处理非常耗时,比如读数据库.文件操作.调用第三方接口等此时用户随时可能关闭浏览器.F5刷新网页等操作.但是服务端的耗时代码任然在执行,这太浪费了,既然用户 ...
- c# WindowsCommunityToolkit--- Shade Animation
WindowsCommunityToolkit: https://github.com/CommunityToolkit/WindowsCommunityToolkit You can also pr ...
- Golang-接口7
http://c.biancheng.net/golang/interface/ Go语言接口声明(定义) Go语言不是一种 "传统" 的面向对象编程语言:它里面没有类和继承的概念 ...
- 【JMeter】---入门
JMeter入门 一.概述 JMeter是Apache下一款在国外非常流行和受欢迎的开源性能测试工具,JMeter可用于模拟大量负载来测试一台服务器,网络或者对象的健壮性或者分析不同负载下的整体性能. ...
- Linux blkid命令
Linux blkid命令:显示块设备属性. Linux blkid命令 功能描述 使用blkid命令可以用来查询系统的块设备(包括交换分区)所使用的文件系统类型.卷标.UUID等信息. Linux ...
- mysql数据库指定ip远程访问(设置远程连接),赋权操作
mysql数据库指定ip远程访问(设置远程连接) 远程访问mysql报错,ip不允许链接的情况:错误号码1045Access denied for user '用户名' @'数据库地址' (using ...
- JUC并发—13.Future模式和异步编程简介
大纲 1.Runnable接口与Callable接口 (1)Runnable接口实现异步任务 (2)Callable接口实现异步任务 2.Future模式 (1)Future模式的概念 (2)Futu ...
- Netty - [01] 概述
题记部分 一.介绍 Netty 是由JBOSS提供的一个Java开源框架,现为Github上的独立项目. Netty是一个异步的.基于事件驱动的网络应用框架,用以快速开发高性能.高可靠性的网络I/O程 ...