【swagger2】开发api文档
文章目录
- 一、swagger2 简介
- 背景
- Open API ???
- swagger2的作用
- swagger2常用工具组件:
- 二、Springfox
- 三、springBoot使用swagger2(简单示例)
- 四、Swagger-UI使用
- 五、配置文件
- 1、配置类:给docket上下文配置api描述信息
- 2、配置类:扫描包
- 3、自定义注解设置不需要生成接口文档的方法
- ▶@Target-描述当前的注解可以定义在什么资源上
- ▶@Retention-当前注解在什么时候有效
- ▶示例
- 4、配置路径范围配置paths()
- 六、Swagger2常用注解
- 常用注解:
- @Api
- @ApiOperation
- @ApiParam
- @ApiImplicitParam-s
- @ApiModel、@ApiModelProperty
一、swagger2 简介
官网:https://swagger.io/
背景
我们后端在编写项目的时候,往往都会在代码上加上注释,方便自己以后的修改和维护,和方便别人的理解。但是对对前后端分离的项目
,前端人员写前端代码,后端人员编写后端的代码。这样的话当前端需要调用我们后端的接口的时候,就会来找我们询问参数以及请求的接口路径。如果每次都来问的话就会很繁琐。所以我们要讲我们自己编写的代码,生成一个api文档,里面描述了我们各种接口调用规则,我们只需要将这个api文档交给前端人员即可。前端人员就可以根据我们提供的文档获取到他们需要调用的接口路径以及参数信息。
Open API ???
Open API规范(OpenAPI Specification)以前叫做Swagger规范是RESTAPI的API描述格式。
Open API文件允许描述整个API,包括:
- 每个访问地址的类型。POST 或GET。I
- 每个操作的参数。包括输入输出参数。
- ·认证方法。
- 连接信息,声明,使用团队和其他信息。
Open API规范可以使用YAML或JSON格式进行编写。这样更利于我们和机器进行阅读。
swagger2的作用
swagger2 是一个规范和完整的框架,用于生成、描述、调用和可视化Restful风格的web服务
作用:
- 接口的文档在线自动生成
- 功能测试
用白话说就是:后端人员写完代码后,不想写开发文档,就嵌用api注解,代码启动,访问固定的路径: ip+端口+路径地址来访问代码。
swagger2常用工具组件:
1、Swagger Editor:基于浏览器编辑器,可以在里面编写Open API规范。类似
Markdown具有实时预览描述文件的功能。(还要自己写,需要会json或者yaml)
2、Swagger UI:将Open API规范呈现为交互式API文档。用可视化U展示描述文件。(注解)
3、Swagger Codegen:将OpenAPI规范生成为服务器存根和客户端库。通过Swagger
Codegen可以将描述文件生成html格式和 cwiki形式的接口文档;同时也可以生成多种
言语的客户端和服务端代码。
4、Swagger Hub:集成了上面所有项月的各个功能,你可以以项目和版本为单位,将你
的描述文件上传到Swagger Hub中。在Swagger Hub中可以完成上面项目的所有工作,
需要注册账号,分免费版和收费版。
二、Springfox
使用Swagger时如果碰见版本更新或迭代时,只需要更改Swagger的描述文件即可。
但是在频繁的更新项目版本时很多开发人员认为即使修改描述文件( yml或json )也是一种负担,就直接改代码,这样开发文档的作用就没意义了。
作用:
Spring-fox是根据代码生成接口文档,所以正常的进行更新项目版本,修改代码即可,
而不需要跟随修改描述文件。
Spring-fox利用自身AOP 特性,把 Swagger集成进来,底层还是Swagger。但是使
用起来确方便很多。所以实际开发中使用springfox。
官网:http://springfox.github.io/springfox/
源码:https://github.com/springfox/springfox
三、springBoot使用swagger2(简单示例)
▶导入依赖:pom.xml,自己库里的其他版本都行
<!--swagger2的依赖--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version></dependency><!--视图逻辑swagger-ui--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version><scope>compile</scope></dependency>
▶先写一个controller,里面有三种请求方法,自定义、get、post
@RestController//方法中所有的返回值都相当于加了一个@ResponseBody
@RequestMapping("/user")
public class MyController {@PostMapping("/getUserById")//post请求public String post(Integer id){return "post:根据id获取User";}@GetMapping("/getUsers")//get请求public String get(){return "get:获取所有的User";}@RequestMapping("/req")//这种请求方式是不限制请求方式的,任意请求方式都可以访问public String req(String m){return "request!!!";}
}
▶在启动类上注解@EnableSwagger2
@EnableSwagger2
springfox提供的注解,代表swagger2相关技术开启,会扫描当前类所在包,及子包中所有的类型中的注解,
▶运行启动类,访问路径:http://localhost:8080/swagger-ui.html
访问swagger-ui.html后可以在页面中着到所有需要生成接口文档的控制器名称
- basic-error-controller中:是springBoot内部的,关于错误提示的controller。
- MyController:自己写的。其中有get和post的请求,还有一个没有限制请求方式的方法。
- ……
四、Swagger-UI使用
【扫描我们编写的所有的控制器,扫描约束,显示在视图中(上面截图)】
@GetMapping("/get")
==这两个方法是等价的==
@RequestMapping(method = {RequestMethod. GET})
Swagger-UI:
- 显示控制器
- 显示控制器中的请求方法(路径地址的处理)、参数、名字等
- 简单测试请求,以及返回的响应结果描述
五、配置文件
上面提到过在视图中有些东西可以修改,与本项目的内容无关,就需要通过配置类来实现修改
1、配置类:给docket上下文配置api描述信息
@Configuration
public class SwaggerConfig1 {/*** 创建Docket类型的对象。并使用spring容器管理。* Docket是Swagger中的全局配置对象。* @return docket*/@Beanpublic Docket createRestApi() {Docket docket = new Docket(DocumentationType.SWAGGER_2);//API帮助文档的描述信息ApiInfo apiInfo = new ApiInfoBuilder().contact( //配置swagger文档主体内容new Contact("简单示例Swagger的开发文档", //是文档的发布者名称"http://www/xxxx", //是文档发布者的网站地址。企业网站"admin@bjsxt.com") //文档发布者的电子邮箱).title("swagger文档标题").description("swagger2 是一个规范和完整的框架,用于生成、描述、调用和可视化Restful风格的web服务,开发帮助文档").version("1.1").build();docket.apiInfo(apiInfo);return docket;}
}
文档运行路径:http://localhost:8080/swagger-ui.html,对比上张图,观察上下文配置api描述信息都是修改的文档的哪个地方。
2、配置类:扫描包
docket.select() //获取Docket中的选择器。返回ApiSelectorBuilder。构建选择器的。如:扫描什么包的注解.apis(RequestHandlerSelectors.basePackage("com.wxy.springboot_swagger.controller")); //规则,设定扫描哪个包(包含子包)
3、自定义注解设置不需要生成接口文档的方法
▶@Target-描述当前的注解可以定义在什么资源上
属性value定义具体的资源,常用:
- ElementType.METHOD可以定义在方法上
- EIementType.TYPE可以定义在类型上
- ElementType.FIELD可以定义在属性上
- ElementType.PARAMETER可以定义在方法参数上
- ……
▶@Retention-当前注解在什么时候有效
属性value-定义具体的生效标记三个:
- RetentionPolicy.RUNTIME-运行时有效(常用)
- RetentionPolicy.SOURCE一源码中有效
- RetentionPolicy.CLASS-字节码有效
▶示例
1.写一个自定义注解类
/*** @interface 代表当前是一个注解类*/
@Target(value = {ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotationSwagger {//自定义注解中的属性。相当于@MyAnnotationSwagger(value="")String value() default "";
}
2.自定义注解的使用:实现controller中“req()”方法不在文档视图中显示
要在controller中req()的方法上添加注解@MyAnnotationSwagger
在配置类中设置规则匹配器(内部是静态方法)
docket = docket.select() //获取Docket中的选择器。返回ApiSelectorBuilder。构建选择器的。如:扫描什么包的注解//.apis(RequestHandlerSelectors.basePackage("com.wxy.springboot_swagger2.controller")) //规则,设定扫描哪个包(包含子包).apis(Predicates.not( //取反:false->true true->falseRequestHandlerSelectors.withMethodAnnotation( //withMethodAnnotation:当方法上有注解时返回trueMyAnnotationSwagger.class)) //方法有什么注解的时候返回true).build(); //重新构建Docket对象
测试:只有get和post两个方法了
Predicates.and()
4、配置路径范围配置paths()
.paths(PathSelectors.regex("/swagger/.*") //使用正则表达式,约束生成API文档的路径地址。//控制器访问路径以swagger开头的。@RequestMapping("/swagger")
)
.paths(Predicates.or( //多个规则符合任意一个即可通过。PathSelectors.regex(pathRegex:"/swagger/.*"),PathSelectors.regex(pathRegex:"/swagger2/.*"),PathSelectors.regex(pathRegex:"/.*"))
)
六、Swagger2常用注解
常用注解:
swagger通过注解表明该接口会生成文档,包括接口名、请求方法、参数、返回信息的等等。
- @Api:修饰整个类,描述Controller的作用。
- tags:给当前类型定义别名,可以有多个。定义几个别名,在ui视图中就显示几个控制器访问菜单。
- description:定义描述
- @ApiOperation:描述一个类的一个方法,或者说一个接口
- @ApiParam:单个参数描述
- @ApiModel:描述实体类型,用对象来接收参数
- @ApiModelProperty:用对象接收参数时,描述对象的一个字段
- @ApiImplicitParam:在方法上描述方法的一个请求参数
- @ApiImplicitParams:多个请求参数
- @ApiIgnore:忽略当前注解描述的方法或类型,不生成api帮助文档
@Api
@RestController
@RequestMapping("/user")
@Api(tags = {"MyController","Swagger测试控制器"},description = "测试API类型描述信息")
public class MyController {……
}
@ApiOperation
@PostMapping("/getUserById")//post请求@ApiOperation(value = "post方法,执行新增操作", notes = "Swagger学习使用-处理POST请求的方法")public String post(Integer id){return "post:根据id获取User";}
@ApiParam
@ApiImplicitParam-s
@GetMapping("/test")
@ApiImplicitParam(name = "m", value = "m参数描述",required = false, paramType = "字符串",dataType = "明值对")
public String test(String m,String n){return "request!!!";
}
@ApiImplicitParams(value = {@ApiImplicitParam(name = "m", value = "m参数描述",required = false, paramType = "字符串",dataType = "明值对"),@ApiImplicitParam(name = "n", value = "n参数描述",required = true, paramType = "字符串",dataType = "明值对")})
@ApiModel、@ApiModelProperty
/*** ApiModel 描述一个实体类型。这个实体类型如果成为任何一个生成api帮助文档方法的* 返回值类型的时候,此注解被解析。*/
@ApiModel(value = "自定义实体类",description = "MyEntity存储用户数据")
public class MyEntity implements Serializable {@ApiModelProperty(value = "主键",name = "主键(id)",required = false,example = "1",hidden = false)private String id;@ApiModelProperty(value = "姓名",name = "姓名(name)",required = true,example = "张三",hidden = false)private String name;@ApiModelProperty(value = "密码",name = "密码(password)",required = true,example = "123456",hidden = false)private String password;public MyEntity(){}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;MyEntity myEntity = (MyEntity) o;return Objects.equals(id, myEntity.id) && Objects.equals(name, myEntity.name) && Objects.equals(password, myEntity.password);}@Overridepublic int hashCode() {return Objects.hash(id, name, password);}
}
返回类型是实体类类型:
@RequestMapping("/testEntity")public MyEntity testEntity(){return new MyEntity();}
相关文章:
【swagger2】开发api文档
文章目录一、swagger2 简介背景Open API ???swagger2的作用swagger2常用工具组件:二、Springfox三、springBoot使用swagger2(简单示例)四、Swagger-UI使用五、配置文件1、配置类:给docket上下文配置api描述信息2、配置类&#…...
Github 上如何提交 pull request
什么是复刻(forking)? 我们可以通过复刻操作将喜爱的仓库保存自己的Github账户中,以便独立地对其进行操作。 通过复刻,我们可以得到包含完整版本历史的目标仓库的实例,之后可以对复刻得到的仓库进行任意操作而不会影响…...
Redis面试知识
概述 Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。 键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。 Redis 支持很多特性,例如将内存中的数据持久化到硬盘中,使用复制来扩展读性能…...
Spring面试重点(四)——Spring事务
Spring事务 事务的方式 spring中使用事务有两种方式,一种是编程式事务,一种是声明式事务。编程式事务推荐使用TransactionTemplate,实现TransactionCallback接口,需要编码实现;声明式事务只需要在函数增加注解Transa…...
♡ — MySQL 存储引擎
MySQL 存储引擎架构 MySQL 存储引擎采用的是插件式架构,支持多种存储引擎,我们甚至可以为不同的数据库设置不同的存储引擎以适应不同场景的需要;存储引擎是基于表的,而不是数据库。 MyISAM 和 InnoDB 的区别 MySQL 5.5 之前&am…...
大数据技术架构(组件)34——Spark:Spark SQL--Optimize
2.2.3、Optimize2.2.3.1、SQL3.3.1.1、RB1、Join选择在Hadoop中,MR使用DistributedCache来实现mapJoin。即将小文件存放到DistributedCache中,然后分发到各个Task上,并加载到内存中,类似于Map结构,然后借助于Mapper的迭…...
Zookeeper实现分布式锁
文章目录ZK节点类型watch监听机制Zookeeper实现分布式锁锁原理创建锁的过程释放锁的过程ZK锁的种类代码实现Zookeeper是一个开源的分布式协调服务,是一个典型的分布式数据一致性解决方案。 分布式应用程序可以基于Zookeeper实现诸如数据发布/订阅,负载均…...
MFC 添加重新启动管理器支持
重启管理器是添加到 Visual Studio for Windows Vista 或更高版本操作系统的功能 如果发生意外关闭或重启,重新启动管理器将为你的应用程序添加支持。 重新启动管理器的行为取决于应用程序的类型。 如果你的应用程序是文档编辑器,则重新启动管理器让应用…...
一文带你深刻的进入Python,并且了解Python的优缺点
最近几年Python被吹的神乎其神,很多同学都不清楚Python到底能干什么?就盲目去学习Python,今天我就Python的应用领域来简单盘点一下,让想学习Python 的同学找对方向不迷茫。 2. Python 的特点 这里就谈谈自己的看法,首先 Python是…...
别具一格,原创唯美浪漫情人节表白专辑,(复制就可用)(html5,css3,svg)表白爱心代码(4)
别具一格,独此一家,原创唯美浪漫情人节表白专辑 不一样的惊喜哦~!(html5,css3,svg)表白爱心代码(复制就可用)(4) 目录 款式四:时光的记忆款 1、拷贝完整源代码 2、更新时光盒所…...
编译原理—翻译方案、属性栈代码
系列文章戳这里👇 什么是上下文无关文法、最左推导和最右推导如何判断二义文法及消除文法二义性何时需要消除左递归什么是句柄、什么是自上而下、自下而上分析什么是LL(1)、LR(0)、LR(1)文法、LR分析表LR(0)、SLR(1)、LR(1)、LALR(1)文法之间的关系编译原理第三章习…...
链表
一、从尾到头打印链表题目:输入一个链表,按链表从尾到头的顺序返回一个ArrayList。解题思路:使用栈作为中转,可以实现倒置打印classSolution { public:vector<int> printListFromTailToHead(ListNode* head){//使用栈完成中…...
CSS 样式优先级
CSS 样式优先级决定了最终呈现在浏览器中的样式是哪一组样式,在多组样式中有冲突时,最终呈现在浏览器中的样式是具有最高优先级的样式。 CSS 样式优先级顺序如下: 内联样式 > 内部样式 > 外部样式 !important > 内联样式 > ID…...
SpingMVC获取请求参数
通过ServletAPI获取请求参数将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象。html<form th:action"{/param/servletAPI}" method"post">用户名:<input ty…...
微搭使用笔记(二)微搭低代码平台介绍及基础使用
概述 官网地址: 官网 官方文档: 官方文档 FAQ: FAQ 腾讯云微搭低代码是一个高性能的低代码开发平台,用户可通过拖拽式开发,可视化配置构建 PC Web、H5 和小程序应用。支持打通企业内部数据,轻松实现企业微信管理、工…...
CountDownLatch的定义、使用 、原理
一、定义 CountDownLatch的作用很简单,就是一个或者一组线程在开始执行操作之前,必须要等到其他线程执行完才可以。我们举一个例子来说明,在考试的时候,老师必须要等到所有人交了试卷才可以走。此时老师就相当于等待线程ÿ…...
《Terraform 101 从入门到实践》 Terraform在公有云Azure上的应用
《Terraform 101 从入门到实践》这本小册在南瓜慢说官方网站和GitHub两个地方同步更新,书中的示例代码也是放在GitHub上,方便大家参考查看。 简介 Azure是微软的公有云,它提供了一些免费的资源,具体可以查看: https:/…...
别具一格,原创唯美浪漫情人节表白专辑,(复制就可用)(html5,css3,svg)表白爱心代码(3)
别具一格,原创唯美浪漫情人节表白专辑, (复制就可用)(html5,css3,svg)表白爱心代码(3) 目录 款式三:心形实时显示认识多长时间桃花飞舞(猫咪)款 1、拷贝完整源代码 2、拷贝完整js代码 3、修改时间 4、…...
Linux 删除修改日期大于某一天的文件
在服务器运维过程中,我们往往会产生大量的日志文件. 如果日志文件命名能看出日志产生的时间,这些文件是很好删除的. 但有时,我们可能有成千上万的没有命名规律日志文件 下面的方法可以根据日志最后修改时间 批量删除这些文件 先给出完整命令: find /mydir -mtime 10 -name &…...
【算法题】1845. 座位预约管理系统
插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家一起学习鸭~~~ 题目: 请你设计一个管理 n 个座位预约的系…...
【专业认知】保研北大金融 / 入职腾讯产品经理
2023.02.11 一. 朱博文学长分享——关于大学生活的一点思考 1. 自我介绍 大数据18级 经济学双学位 保研至北大金融硕士 “多思考、多感受、兼听则明” 2. 大学生活 2.1 为什么要上大学 1:追求美好生活的需要 “美好”难以量化,因为每个人对生活…...
OpenHarmony使用Socket实现一个UDP客户端详解
一、前言 我们在这里介绍Socket的使用,是为了后面的一篇文章实现设备配网做铺垫。 二、示例详解 点击获取BearPi-HM_Nano源码 ,以D3_iot_udp_client为例: 示例本身很简单,只需要修改 udp_client_demo.c 的2处代码,就能测试了: //连接WIFI,参数1是:WIFI名称,参数2是:…...
使用VUE自定义组件封装部门选择功能
背景 照惯例,先交待下背景,从真实需求出发,讲述实现效果、设计思路和实现方式。 软件系统中,会有一些常见常用的选择功能,如部门选择、人员选择等,用于填报表单,使用频率很高。直接使用一方面会…...
C语言基础应用(一)数据类型
一、数据类型 1、数据类型的分类 2、常量 常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。 2.1 常量举例 // 整型常量 举例 /*718 十进制0213 八进制0x4b 十六进制30u 无符号整数30l 长整型30ul 无符号长整型*/ // 浮点常量…...
算法笔记(三)—— 桶排序及排序总结
堆 逻辑上是一棵完全二叉树(依次遍满或者全满)。 数组可以转为完全二叉树,完全二叉树某结点左孩子(2*i1),右孩子(i*22),父结点((i-1/)2),根节点的父还是自己。 如何将数组转化为堆(大根堆&…...
Linux入门篇(一)
Linux前言Linux初探Linux内核GNU实用工具shellLinux发行版bash shell 基础Linux文件系统Linux文件操作命令前言 在阅读诸如docker之类的书的时候,经常碰到Linux的知识。同时,大部分的盲区也是在Linux方面。因此就想稍微了解一下这个广为人使用的操作系统…...
HTTPSHandler SSL Error
我在服务器ubuntu中,尝试使用pip3,但是出现下面的报错 ImportError: cannot import name HTTPSHandler 通过查询资料,发现报错的原因是,该pip3.5中没有安装好openssl. 我尝试在python3.5中使用import ssl, 确实是会显示下面的报错…...
基于Android的高校食堂餐厅配送系统
需求信息: 商家客户端: 1:登录注册:用户可以通过自己的信息进行账号的注册 2:发布菜单:发布自己经营的美食信息 3:用户订单:查看用户的购买订单 4:订单配送:对…...
Java设计模式-02工厂模式
为什么需要工厂模式,其作用什么?如何实现,代码演示解析优缺点。Q1:为什么需要工厂模式?工厂模式的作用(优点)是什么? 解耦。把对象的创建和使用的过程分开。就是Class A 想调用 Class B ,那么A只是调用B的…...
AXI-Lite 学习笔记
AXI-Lite 学习笔记 参考 FPGA:AXI_Lite总线基础2-1]、第二节 AXI总线介绍、ZYNQ PL与PS交互专题_哔哩哔哩_bilibili AXI-Lite总线系列1 - 基础知识_哔哩哔哩_bilibili AXI4 介绍 AXI4 是ARM公司提出的一种片内总线,描述了主从设备之间的数据传输方式。主…...
长春疫情最新消息今天新增病例/aso优化什么意思是
系列63 物理学原理光学 应用非透明标签探测 标签宽度2 mm 标签间隙2 mm 介质不透明 供电电压 UB10 ... 30 V, DC 输入端 示教输入数1 光束 输出 数字开关量输出数1 光束 开关量输出1 开关元件晶体管, 推挽 开关原理标签上的开关信号 槽宽3 mm 槽深61 mm 尺寸(宽 x…...
电子商务网站建设实训方案/抖音seo优化公司
在JS中。是没有块级作用域的 举两个个样例: if语句块: if (true){var nameLing; } alert(name);输出:Ling for语句块; for(var i0;i<10;i) {var nameLing; } alert(i); alert(name);输出:10 输出:Ling 也就是说…...
日本设计 网站/代发百度关键词排名
http://bbs.hupu.com/3774151.html 美国的徒手健身大师给执法部队和特种部队训练用的,安全且有效,不会有肌肉受伤风险,也不需要器材,但效果明显。 对于前线作战部队来说,训练中最重要的是安全,在训练中把肌…...
信誉好的集团网站建设/微友圈推广平台怎么加入
有时候我们会在列表页或者内容详情页调用指定的顶级栏目名称及链接,试了很多方法,有的只能调用所有顶级栏目或者是该频道下面的子栏目,实在是让人感到费解。。下面说说各种栏目名称的调用方法:1、{dede:field name"typename&…...
wordpress系列文章/seo专业培训中心
问题报错: Plugin execution not covered by lifecycle configuration: org.apache.maven.plugins:maven-resources-plugin:2.6:resources 问题原因: m2e在其执行maven的生命周期管理时没有定义该插件 解决办法: 1、eclipse:…...
响应式网站建设多少钱/网络广告案例以及分析
linux系统中,nl命令用来计算文件中行号。nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等的功能。 1.命令格式࿱…...