swagger 动态设置版本号_如何快速玩转swagger

Spring Boot 框架是目前非常流行的微服务框架,我们很多情况下使用它来提供 Rest API。而对于 Rest API 来说很重要的一部分内容就是文档,Swagger 为我们提供了一套通过代码和注解自动生成文档的方法,这一点对于保证 API 文档的及时性将有很大的帮助。本文将使用 Swagger 2 规范的 Springfox 实现来了展示如何在 Spring Boot 项目中使用 Swagger,主要包含了如何使用 Swagger 自动生成文档、使用 Swagger 文档以及 Swagger 相关的一些高级配置和注解。

Swagger 简介

Swagger 是一套基于 OpenAPI 规范构建的开源工具,可以帮助我们设计、构建、记录以及使用 Rest API。Swagger 主要包含了以下三个部分:

•Swagger Editor :基于浏览器的编辑器,我们可以使用它编写我们 OpenAPI 规范。•Swagger UI:它会将我们编写的 OpenAPI 规范呈现为交互式的 API 文档,后文我将使用浏览器来查看并且操作我们的 Rest API。•Swagger Codegen:它可以通过为 OpenAPI(以前称为 Swagger)规范定义的任何 API 生成服务器存根和客户端 SDK 来简化构建过程。

为什么要使用 Swagger

当下很多公司都采取前后端分离的开发模式,前端和后端的工作由不同的工程师完成。在这种开发模式下,维持一份及时更新且完整的 Rest API 文档将会极大的提高我们的工作效率。传统意义上的文档都是后端开发人员手动编写的,相信大家也都知道这种方式很难保证文档的及时性,这种文档久而久之也就会失去其参考意义,反而还会加大我们的沟通成本。而 Swagger 给我们提供了一个全新的维护 API 文档的方式,下面我们就来了解一下它的优点:

•代码变,文档变。只需要少量的注解,Swagger 就可以根据代码自动生成 API 文档,很好的保证了文档的时效性。 跨语言性,支持 40 多种语言。•Swagger UI 呈现出来的是一份可交互式的 API 文档,我们可以直接在文档页面尝试 API 的调用,省去了准备复杂的调用参数的过程。•还可以将文档规范导入相关的工具(例如 SoapUI), 这些工具将会为我们自动地创建自动化测试。

以上这些优点足以说明我们为什么要使用 Swagger 了,您是否已经对 Swagger 产生了浓厚的兴趣了呢?下面我们就将一步一步地在 Spring Boot 项目中集成和使用 Swagger,让我们从准备一个 Spring Boot 的 Web 项目开始吧。

准备 Spring Boot Web 项目

在这一步我们将准备一个基础的 Spring Boot 的 Web 项目,并且提供后面所需要的所有 API。

创建一个空的 Spring Boot 项目

您可以通过 Spring Initializr 页面 生成一个空的 Spring Boot 项目,当然也可以下载 springboot-pom.xml 文件,然后使用 Maven 构建一个 Spring Boot 项目。项目创建完成后,为了方便后面代码的编写您可以将其导入到您喜欢的 IDE 中,我这里选择了 Intelli IDEA 打开。

添加依赖

由于创建的是一个 Web 项目,所以我们需要依赖 Spring Boot 的 Web 组件,只需要在 pom.xml 增加如下内容即可:

清单 1. 添加 Web 依赖

    org.springframework.boot    spring-boot-starter-web

编写接口

•首先我们创建三个包:cn.smalltech.swagger.controller、cn.smalltech.swagger.testcontroller 以及 cn.smalltech.swagger.model。•在 controller 包下新建 UserController.java 类,在 testcontroller 包下新建 TestController.java 类,在 model 包下新建 User.java 类。•UserController 提供用户的增、删、改、查四个接口,TestContrller 提供一个测试接口,这里粘上 UserController.java 的代码,其余代码可以查看源码 。

清单 2. UserController.java 代码

@RestController@RequestMapping("/user")public class UserController {    @PostMapping("/add")    public boolean addUser(@RequestBody User user) {        return false;    }    @GetMapping("/find/{id}")    public User findById(@PathVariable("id") int id) {        return new User();    }    @PutMapping("/update")    public boolean update(@RequestBody User user) {        return true;    }    @DeleteMapping("/delete/{id}")    public boolean delete(@PathVariable("id") int id) {        return true;    }}

集成 Swagger2

经过上面的步骤,我们已经拥有了五个接口,分别是:

•/user/add:新增用户。•/user/find/{id}:根据 id 查询用户。•/user/update:更新用户。•/user/delete/{id}:根据 id 删除用户。•/test/test:测试接口。 下面我们将通过集成 Swagger2,然后为这 5 个 Rest API 自动生成接口文档。

添加依赖

首先要做的自然是添加 Swagger2 所需要的依赖包:

清单 3. 添加 Swagger 依赖

    io.springfox    springfox-swagger2    2.9.2

Java 配置

Springfox 提供了一个 Docket 对象,让我们可以灵活的配置 Swagger 的各项属性。下面我们新建一个 cn.itweknow.sbswagger.conf.SwaggerConfig.java 类,并增加如下内容:

清单 4. Swagger Java 配置

@Configuration@EnableSwagger2public class SwaggerConfig {    @Bean    public Docket api() {        return new Docket(DocumentationType.SWAGGER_2)                .select()                .apis(RequestHandlerSelectors.any())                .paths(PathSelectors.any())                .build();    }}

注意: @Configuration 是告诉 Spring Boot 需要加载这个配置类, @EnableSwagger2 是启用 Swagger2,如果没加的话自然而然也就看不到后面的验证效果了。

验证 至此,我们已经成功的在 Spring Boot 项目中集成了 Swagger2,启动项目后,我们可以通过在浏览器中访问 http://localhost:8080/v2/api-docs 来验证,您会发现返回的结果是一段 JSON 串,可读性非常差。幸运的是 Swagger2 为我们提供了可视化的交互界面 SwaggerUI,下面我们就一起来试试吧。

集成 Swagger UI 添加依赖 和之前一样,集成的第一步就是添加相关依赖,在 pom.xml 中添加如下内容即可:

清单 5. 添加 Swagger UI 依赖

io.springfox springfox-swagger-ui 2.9.2

访问验证

其实就只需要添加一下依赖就可以了,我们重新启动一下项目,然后在浏览器中访问 http://localhost:8080/swagger-ui.html 就可以看到如下的效果了:

图 1. Swagger UI

008b57b4267390d60a25b5d9e0c438bc.png

可以看到虽然可读性好了一些,但对接口的表述还不是那么的清楚,接下来我们就通过一些高级配置,让这份文档变的更加的易读。

高级配置

文档相关描述配置

•1.通过在控制器类上增加 @Api 注解,可以给控制器增加描述和标签信息。

清单 6. 给 Controller 添加描述信息

@Api(tags = "用户相关接口", description = "提供用户相关的 Rest API")public class UserController

•2.通过在接口方法上增加 @ApiOperation 注解来展开对接口的描述,当然这个注解还可以指定很多内容,我们在下面的相关注解说明章节中详细解释。

清单 7. 给接口添加描述信息

@ApiOperation("新增用户接口")@PostMapping("/add")public boolean addUser(@RequestBody User user) {    return false;}

•3.实体描述,我们可以通过 @ApiModel 和 @ApiModelProperty 注解来对我们 API 中所涉及到的对象做描述。

清单 8. 给实体类添加描述信息

@ApiModel("用户实体")public class User {    @ApiModelProperty("用户 id")private int id;}

•4.文档信息配置,Swagger 还支持设置一些文档的版本号、联系人邮箱、网站、版权、开源协议等等信息,但与上面几条不同的是这些信息不是通过注解配置,而是通过创建一个 ApiInfo 对象,并且使用 Docket.appInfo() 方法来设置,我们在 SwaggerConfig.java 类中新增如下内容即可。

清单 9. 配置文档信息

@Beanpublic Docket api() {return new Docket(DocumentationType.SWAGGER_2).select()            .apis(RequestHandlerSelectors.any())            .paths(PathSelectors.any())            .build()            .apiInfo(apiInfo());}private ApiInfo apiInfo() {return new ApiInfo(            "Spring Boot 项目集成 Swagger 实例文档",            "我的博客网站:https://smalltechnologyjun.com,欢迎大家访问。",            "API V1.0",            "Terms of service",            new Contact("名字想好没", "https://smalltechnologyjun.com", "xxxxx@gmail.com"),                "Apache", "http://www.apache.org/", Collections.emptyList());}

经过上面的步骤,我们的文档将会变成下图的样子,现在看起来就清楚很多了。

图 2. 补全信息后的 Swagger 文档界面

3d3d0f5e6d346fe2fef46c635aa2d077.png

接口过滤

有些时候我们并不是希望所有的 Rest API 都呈现在文档上,这种情况下 Swagger2 提供给我们了两种方式配置,一种是基于 @ApiIgnore 注解,另一种是在 Docket 上增加筛选。

1.@ApiIgnore 注解。

如果想在文档中屏蔽掉删除用户的接口(user/delete),那么只需要在删除用户的方法上加上 @ApiIgnore 即可。

清单 10. @ApiIgnore 使用实例

@ApiIgnorepublic boolean delete(@PathVariable("id") int id)

1.在 Docket 上增加筛选。Docket 类提供了 apis() 和 paths() 两个方法来帮助我们在不同级别上过滤接口:•apis() :这种方式我们可以通过指定包名的方式,让 Swagger 只去某些包下面扫描。•paths() :这种方式可以通过筛选 API 的 url 来进行过滤。 在集成 Swagger2 的章节中我们这两个方法指定的都是扫描所有,没有指定任何过滤条件。如果我们在我们修改之前定义的 Docket 对象的 apis() 方法和 paths() 方法为下面的内容,那么接口文档将只会展示 /user/add 和 /user/find/{id} 两个接口。

清单 11. 使用 Docket 配置接口筛选

.apis(RequestHandlerSelectors.basePackage("cn.itweknow.sbswagger.controller")).paths(Predicates.or(PathSelectors.ant("/user/add"),        PathSelectors.ant("/user/find/*")))

图 3. 经过筛选过后的 Swagger 文档界面

98253ed78ef98d25b03b842056ab2140.png

自定义响应消息

Swagger 允许我们通过 Docket 的 globalResponseMessage() 方法全局覆盖 HTTP 方法的响应消息,但是首先我们得通过 Docket 的 useDefaultResponseMessages 方法告诉 Swagger 不使用默认的 HTTP 响应消息,假设我们现在需要覆盖所有 GET 方法的 500 和 403 错误的响应消息,我们只需要在 SwaggerConfig.java 类中的 Docket Bean 下添加如下内容:

清单 12. 自定义响应消息

.useDefaultResponseMessages(false).globalResponseMessage(RequestMethod.GET, newArrayList(new ResponseMessageBuilder()              .code(500)              .message("服务器发生异常")              .responseModel(new ModelRef("Error"))              .build(),       new ResponseMessageBuilder()              .code(403)              .message("资源不可用")              .build()));

添加如上面的代码后,如下图所示,您会发现在 SwaggerUI 页面展示的所有 GET 类型请求的 403 以及 500 错误的响应消息都变成了我们自定义的内容。

图 4. 自定义响应消息

c36a6cd472749a55d241674230f7f431.png

Swagger UI 的使用

接口查看

SwaggerUI 会以列表的方式展示所有扫描到的接口,初始状态是收缩的,我们只需要点击展开就好,而且会在左边标识接口的请求方式(GET、POST、PUT、DELETE 等等)。

图 5. Swagger 接口列表界面

ecc7d09c6b8712531f81bd499113f788.png

接口调用

如下图所示,点击接口展开后页面右上角的 Try it out 按钮后,页面会变成如图所示:

图 6. 接口详情界面

6ce0c8d3101ead1d729f2701d0ede439.png

SwaggerUI 会给我们自动填充请求参数的数据结构,我们需要做的只是点击 Execute 即可发起调用

图 7. 接口调用界面

403b4a716b82e64f9049a59183223054.png

Model

如下图所示,SwaggerUI 会通过我们在实体上使用的 @ApiModel 注解以及 @ApiModelProperty 注解来自动补充实体以及其属性的描述和备注。

图 8. 实体界面

6a6184f5971cbbdf61474f90c79f9663.png

相关注解说明

在本文中我将给出一些 Swagger 中常用的注解以及其常用的属性,并对其一一解释,方便您查看。

Controller 相关注解

@Api: 可设置对控制器的描述。

表 1. @Api 主要属性

注解属性类型描述
tagsString[]控制器标签。
descriptionString控制器描述(该字段被申明为过期)

表 2. @ApiOperation 主要属性

注解属性类型描述
valueString接口说明
notesString接口发布说明。
tagsStirng[]标签。
responseClass>接口返回类型。
httpMethodString接口请求方式。

@ApiIgnore: Swagger 文档不会显示拥有该注解的接口。 @ApiImplicitParams: 用于描述接口的非对象参数集。 @ApiImplicitParam: 用于描述接口的非对象参数,一般与 @ApiImplicitParams 组合使用。

81ca4cbd8560792636956c1f331e08f9.png

持续精彩请点击小程序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

angular java_带有Angular JS的Java EE 7 –第1部分

angular java今天的帖子将向您展示如何使用Java EE 7和Angular JS构建一个非常简单的应用程序。 在去那里之前,让我告诉您一个简短的故事: 我必须承认,我从来都不是Java语言的忠实拥护者,但是我仍然记得我第一次使用它。 我不记得…

操作系统的msxml组件版本过低_Zabbix 5.0 LTS 版本安装

zabbix 5.0 版本于 5 月 11 日正式发布,是最新的 LTS(长期支持)版本,5.0 带来很多功能和特性,后面会陆续推出文章介绍,下面主要介绍下 5.0 版本的安装。环境要求5.0 版本对基础环境的要求有大的变化,最大的就是对 php …

登录判断_Spring Security之多次登录失败后账户锁定功能的实现

在上一次写的文章中,为大家说到了如何动态的从数据库加载用户、角色、权限信息,从而实现登录验证及授权。在实际的开发过程中,我们通常会有这样的一个需求:当用户多次登录失败的时候,我们应该将账户锁定,等…

通过TLS发送的Java邮件

抽象 本博客的目的是演示如何使用Java Mail通过具有TLS连接的SMTP服务器发送电子邮件。 免责声明 这篇文章仅供参考。 在使用所提供的任何信息之前,请认真思考。 从中学到东西,但最终自己做出决定,风险自负。 要求 我使用以下主要技术完成了…

html实体转化字符串 php_php将字符串转为HTML的实体引用的一个类

class HtmlEncode {static $_convertToHtmlEntitiesSrcEncodingUTF-8;/*** 将非ASCII字符串转换成HTML实体** example HtmlEncode::encode("我信了"); //输出:我信了* param string $s 要进行编码的字符串* return string 返回HTML实体引用*/public static function …

arcgis导入excel字段不显示_ArcGIS从excel中导入坐标出现空白无法选择字段

怎样将PDF转成EXCEL怎样将PDF转成EXCEL EXCEL和PDF这两种文档大家应该都比较熟悉,EXCEL表格是使用于数据图表得整理,而PDF文件是用于扫描或者存档,但是这两者之间经常需要进行转换得,比如说经常需要将归档的PDF文件转换成EXCEL表格…

atomic java_在Java中添加@atomic操作

atomic java总览 原子操作如何在Java中工作,OpenJDK / Hotspot中是否存在可以转换为原子的当前替代方法。 反馈 在我以前的文章中, 对可变字段进行原子操作。 有几次指出,不管善意如何,“修复”先前的行为都不太可能继续进行。 …

a4988 脉宽要求_Allegro MicroSystems - A4988: 带转换器和过流保护的 DMOS 微步驱动器

A4988 是一款完全的微步电动机驱动器,带有内置转换器,易于操作。该产品可在全、半、1/4、1/8 及 1/16 步进模式时操作双极步进电动机,输出驱动性能可达 35 V 及 2 A。A4988 包括一个固定关断时间电流稳压器,该稳压器可在慢或混合…

磁盘支持的阵列列表

有时,您的列表可能会变得太大而无法容纳在内存中,因此您必须采取一些措施以避免内存不足。 做到这一点的正确方法是流传输–而不是将所有内容都放入内存中,您应该从源流传输数据并丢弃已经处理的条目。 但是,在某些情况下&#…

apache图片cache容量_apache利用mod_cache缓存图片等

一,引言以前我写过二篇有关图片,静态文件的缓存文章,一个是用varnish来缓存,一个用squid来缓存,apache当然也可以用来做图片,静态文件的缓存,下面我将详细说明一下,怎么完装和配置二…

艾特某人代码实现_Vue@某人,At某人,仿新浪微博@某人,@user,艾特,艾特某人...

atuser.vue展开更多群成员import getCaretCoordinates from textarea-caretexport default {props: {value: { //输入框初始值type: String,default: null},suffix: { //插入字符链接type: String,default: },loop: { //上下箭头循环type: Boolean,default: true},avoidEmail:…

spring batch_Spring Batch作为Wildfly模块

spring batch长期以来,Java EE规范缺少批处理API。 今天,这对于企业应用程序来说是必不可少的。 这是最后固定与JSR-352批处理应用程序的Java平台现在的Java EE提供7 JSR-352得到了它的的灵感Spring Batch的对手。 两者涵盖相同的概念,尽管生…

h3c 链路聚合测试_良无磐石固,虚名复何益?- 链路聚合协议互通测试

一、描述链路聚合是将多条链路聚合在一起形成一个汇聚组,以实现负荷在各成员链路中的分担,同时也提供了更高的连接可靠性。Cisco的链路聚合有几种方式:手工、LACP(包括active和passive两种)、PAgP(Port-aggregation Protocol),其中…

Spring@懒惰注释

介绍: 默认情况下, Spring框架在应用程序启动时加载并热切初始化所有bean。 在我们的应用程序中,我们可能有一些非常消耗资源的bean。 我们宁愿根据需要加载此类bean。 我们可以使用Spring Lazy批注实现此目的 。 在本教程中,我们…

变压器符号_行输出变压器的结构、符号及电路分析

行输出变压器又称逆程变压器、回扫变压器,俗称行输出,它是电视机、显示器中的一个重要变压器。1.行输出变压器结构行输出变压器的全部绕组和高压整流管均密封在其中,底部引出各个绕组的引脚,高压输出采用高压引线直接送至显像管的…

西南医院微服务咋查得到_#全国最好医院排行榜#发布:成都这4家牛了!四川31个专科排全国前十(总榜)...

病急不能乱投医!近日,一年一度、令人期待的——复旦版《2018年度中国医院排行榜(总榜)》全新揭晓了~这份榜单不仅是是中国医院学科建设的一个标杆也是大众疑难杂症寻找好医院的重要参考四川4家医院入百强!华西全国第二…

jit 和 jvm_关于JVM和JIT的一点点

jit 和 jvm如您所知,JVM(Java Virtusal Machine)使Java能够遵循“一次写入,随处运行”的范例。 JVM的核心包括以下组件: 堆 叠放 PermGen和方法区域 JIT编译器 代码缓存 堆是在应用程序代码开发阶段为您使用的每…

voxelnet_ue4商城资源Voxel Sandbox Toolkit体素沙盒工具箱

Unreal Engine虚幻游戏引擎素材资源 Unreal Engine Marketplace –Voxel Sandbox Toolkit体素沙盒工具箱体素沙盒工具箱是一个新的改进版本的体素生成从2016年适应4.22的需要。它用不同类型的立方体、树和拾取网格生成无限世界。因为额外的代码实现比以前的版本快得多。理想的创…

Pub / Sub本地模拟器

发布/订阅是GCP提供的不错的工具。 它非常方便,可以帮助您解决应用程序可能面临的消息传递难题。 实际上,如果您使用GCP,则可以使用托管消息解决方案。 如预期的那样,使用实际的发布/订阅解决方案需要一定的配额,因此…

mysql 写入随机字中文符_MySQL产生随机字符

MySQL产生随机字符UUID简介UUID含义是通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部份…