Spring Boot 2.x基础教程:使用Swagger2构建强大的API文档

随着前后端分离架构和微服务架构的流行,我们使用Spring Boot来构建RESTful API项目的场景越来越多。通常我们的一个RESTful API就有可能要服务于多个不同的开发人员或开发团队:IOS开发、Android开发、Web开发甚至其他的后端服务等。为了减少与其他团队平时开发期间的频繁沟通成本,传统做法就是创建一份RESTful API文档来记录所有接口细节,然而这样的做法有以下几个问题:

  • 由于接口众多,并且细节复杂(需要考虑不同的HTTP请求类型、HTTP头部信息、HTTP请求内容等),高质量地创建这份文档本身就是件非常吃力的事,下游的抱怨声不绝于耳。
  • 随着时间推移,不断修改接口实现的时候都必须同步修改接口文档,而文档与代码又处于两个不同的媒介,除非有严格的管理机制,不然很容易导致不一致现象。

为了解决上面这样的问题,本文将介绍RESTful API的重磅好伙伴Swagger2,它可以轻松的整合到Spring Boot中,并与Spring MVC程序配合组织出强大RESTful API文档。它既可以减少我们创建文档的工作量,同时说明内容又整合入实现代码中,让维护文档和修改代码整合为一体,可以让我们在修改代码逻辑的同时方便的修改文档说明。另外Swagger2也提供了强大的页面测试功能来调试每个RESTful API。具体效果如下图所示:

下面来具体介绍,在Spring Boot中使用我们自己实现的starter来整合Swagger。该整合项目的Github:https://github.com/SpringForAll/spring-boot-starter-swagger。如果您觉得它好用,欢迎Star支持我们!

准备工作

首先,我们需要一个Spring Boot实现的RESTful API工程,若您没有做过这类内容,建议先阅读上一篇教程:
Spring Boot 2.x基础教程:构建RESTful API与单元测试构建一个。或者也可以直接使用上一篇教程中的样例作为基础,即下面仓库中的chapter2-1工程:

  • Github:https://github.com/dyc87112/SpringBoot-Learning/tree/2.x
  • Gitee:https://gitee.com/didispace/SpringBoot-Learning/tree/2.x

整合Swagger2

下面,我们以上面仓库中的chapter2-1工程进行整合改造。

第一步:添加swagger-spring-boot-starter依赖

pom.xml中加入依赖,具体如下:

<dependency>
<groupId>com.spring4all</groupId>
<artifactId>swagger-spring-boot-starter</artifactId>
<version>1.9.0.RELEASE</version>
</dependency>

第二步:应用主类中添加@EnableSwagger2Doc注解,具体如下

@EnableSwagger2Doc
@SpringBootApplication
public class Chapter22Application {

public static void main(String[] args) {
SpringApplication.run(Chapter22Application.class, args);
}

}

第三步application.properties中配置文档相关内容,比如

swagger.title=spring-boot-starter-swagger
swagger.description=Starter for swagger 2.x
swagger.version=1.4.0.RELEASE
swagger.license=Apache License, Version 2.0
swagger.licenseUrl=https://www.apache.org/licenses/LICENSE-2.0.html
swagger.termsOfServiceUrl=https://github.com/dyc87112/spring-boot-starter-swagger
swagger.contact.name=didi
swagger.contact.url=http://blog.didispace.com
swagger.contact.email=dyc87112@qq.com
swagger.base-package=com.didispace
swagger.base-path=/**

各参数配置含义如下:

  • swagger.title:标题
  • swagger.description:描述
  • swagger.version:版本
  • swagger.license:许可证
  • swagger.licenseUrl:许可证URL
  • swagger.termsOfServiceUrl:服务条款URL
  • swagger.contact.name:维护人
  • swagger.contact.url:维护人URL
  • swagger.contact.email:维护人email
  • swagger.base-package:swagger扫描的基础包,默认:全扫描
  • swagger.base-path:需要处理的基础URL规则,默认:/**

更多配置说明可见官方说明:https://github.com/SpringForAll/spring-boot-starter-swagger

第四步:启动应用,访问:http://localhost:8080/swagger-ui.html,就可以看到如下的接口文档页面:

添加文档内容

在整合完Swagger之后,在http://localhost:8080/swagger-ui.html页面中可以看到,关于各个接口的描述还都是英文或遵循代码定义的名称产生的。这些内容对用户并不友好,所以我们需要自己增加一些说明来丰富文档内容。如下所示,我们通过@Api@ApiOperation注解来给API增加说明、通过@ApiImplicitParam@ApiModel@ApiModelProperty注解来给参数增加说明。

比如下面的例子:

@Api(tags = "用户管理")
@RestController
@RequestMapping(value = "/users") // 通过这里配置使下面的映射都在/users下
public class UserController {

// 创建线程安全的Map,模拟users信息的存储
static Map<Long, User> users = Collections.synchronizedMap(new HashMap<>());

@GetMapping("/")
@ApiOperation(value = "获取用户列表")
public List<User> getUserList() {
List<User> r = new ArrayList<>(users.values());
return r;
}

@PostMapping("/")
@ApiOperation(value = "创建用户", notes = "根据User对象创建用户")
public String postUser(@RequestBody User user) {
users.put(user.getId(), user);
return "success";
}

@GetMapping("/{id}")
@ApiOperation(value = "获取用户详细信息", notes = "根据url的id来获取用户详细信息")
public User getUser(@PathVariable Long id) {
return users.get(id);
}

@PutMapping("/{id}")
@ApiImplicitParam(paramType = "path", dataType = "Long", name = "id", value = "用户编号", required = true, example = "1")
@ApiOperation(value = "更新用户详细信息", notes = "根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息")
public String putUser(@PathVariable Long id, @RequestBody User user) {
User u = users.get(id);
u.setName(user.getName());
u.setAge(user.getAge());
users.put(id, u);
return "success";
}

@DeleteMapping("/{id}")
@ApiOperation(value = "删除用户", notes = "根据url的id来指定删除对象")
public String deleteUser(@PathVariable Long id) {
users.remove(id);
return "success";
}

}

@Data
@ApiModel(description="用户实体")
public class User {

@ApiModelProperty("用户编号")
private Long id;
@ApiModelProperty("用户姓名")
private String name;
@ApiModelProperty("用户年龄")
private Integer age;

}

完成上述代码添加后,启动Spring Boot程序,访问:http://localhost:8080/swagger-ui.html,就能看到下面这样带中文说明的文档了(其中标出了各个注解与文档元素的对应关系以供参考):

API文档访问与调试

在上图请求的页面中,我们看到user的Value是个输入框?是的,Swagger除了查看接口功能外,还提供了调试测试功能,我们可以点击上图中右侧的Model Schema(黄色区域:它指明了User的数据结构),此时Value中就有了user对象的模板,我们只需要稍适修改,点击下方“Try it out!”按钮,即可完成了一次请求调用!

此时,你也可以通过几个GET请求来验证之前的POST请求是否正确。

相比为这些接口编写文档的工作,我们增加的配置内容是非常少而且精简的,对于原有代码的侵入也在忍受范围之内。因此,在构建RESTful API的同时,加入Swagger来对API文档进行管理,是个不错的选择。

代码示例

本文的完整工程可以查看下面仓库中的chapter2-2目录:

  • Github:https://github.com/dyc87112/SpringBoot-Learning/
  • Gitee:https://gitee.com/didispace/SpringBoot-Learning/

如果您觉得本文不错,欢迎Star支持,您的关注是我坚持的动力!更多本系列免费教程连载「点击进入汇总目录」

其他参考

如果您不想使用我们封装的starter,而是想要整合原始的Swagger,那么也可以参考1.x版本的教程:Spring Boot中使用Swagger2构建强大的RESTful API文档。


money.jpg

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

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

相关文章

剑指Offer - 面试题7. 重建二叉树(递归)

1. 题目 输入某二叉树的前序遍历和中序遍历的结果&#xff0c;请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如&#xff0c;给出前序遍历 preorder [3,9,20,15,7] 中序遍历 inorder [9,3,15,20,7] 返回如下的二叉树&#xff1a;3/ \9 20/ …

郑州大学一女生私自外出染新冠被立案,校方回应:开除!

近日&#xff0c;郑大一女生私自外出会男友&#xff0c;室友替做核酸&#xff0c;感染新冠被立案一事引发大众关注。5月19日&#xff0c;郑州大学一工作人员回应此事称&#xff0c;该私自外出女生已经被自动开除&#xff0c;对室友的处罚要等警方进一步的调查结果&#xff0c;“…

Spring Boot 2.x基础教程:构建RESTful API与单元测试

首先&#xff0c;回顾并详细说明一下在快速入门中使用的Controller、RestController、RequestMapping注解。如果您对Spring MVC不熟悉并且还没有尝试过快速入门案例&#xff0c;建议先看一下快速入门的内容。 Controller&#xff1a;修饰class&#xff0c;用来创建处理http请…

剑指Offer - 面试题11. 旋转数组的最小数字(二分查找)

1. 题目 把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;我们称之为数组的旋转。输入一个递增排序的数组的一个旋转&#xff0c;输出旋转数组的最小元素。例如&#xff0c;数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转&#xff0c;该数组的最小值为1。 示例 1&#…

核酸检测机器人来了!体验者:捅的很温柔

编 | 袁榭、桃子源 | 新智元5月21日&#xff0c;上海人工智能研究院宣布「SAIRI赛瑞」智能核酸采样车2.0问世&#xff0c;仅需30秒便可完成一次采样。在新冠流行持续不断、核酸检测逐渐广域常态化的当下&#xff0c;不止一家机构在开发核酸检测的机器人系统2022年5月21日&#…

AI作画新高度!谷歌发布imagen,效果惊艳全场

文 | 梦晨 鱼羊 发自 凹非寺源 | 量子位在让AI搞创作这件事上&#xff0c;谷歌和OpenAI正面刚起来了。这不&#xff0c;震惊全网的DALLE 2才新鲜出炉一个月&#xff0c;谷歌就派出名为Imagen的选手来打擂台。直接上图对比&#xff0c;左边是谷歌Imagen选手眼中的“猫猫绊倒人类…

Spring Boot 2.x基础教程:配置文件详解

在快速入门一节中&#xff0c;我们轻松的实现了一个简单的RESTful API应用&#xff0c;体验了一下Spring Boot给我们带来的诸多优点&#xff0c;我们用非常少的代码量就成功的实现了一个Web应用&#xff0c;这是传统的Spring应用无法办到的&#xff0c;虽然我们在实现Controlle…

剑指Offer - 面试题12. 矩阵中的路径(DFS回溯)

1. 题目 请设计一个函数&#xff0c;用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始&#xff0c;每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格&#xff0c;那么该路径不能再次进入该格子。例如…

一篇论文8778个作者:人均写5个字,署名用了17页

文 | 梦晨(发自凹非寺)源 | 公众号QbitAI一篇论文有8778位作者是什么感觉&#xff1f;在PDF里&#xff0c;光作者列表就要占17页。有人试图把所有名字排版在同一页&#xff0c;字已经小到看不清。这篇论文来自欧洲核子研究中心的ATLAS对撞机合作组&#xff0c;刷新了他们在2015…

Spring Boot 2.x基础教程:工程结构推荐

Spring Boot框架本身并没有对工程结构有特别的要求&#xff0c;但是按照最佳实践的工程结构可以帮助我们减少可能会遇见的坑&#xff0c;尤其是Spring包扫描机制的存在&#xff0c;如果您使用最佳实践的工程结构&#xff0c;可以免去不少特殊的配置工作。 典型示例 以下结构是…

剑指Offer - 面试题18. 删除链表的节点

1. 题目 给定单向链表的头指针和一个要删除的节点的值&#xff0c;定义一个函数删除该节点。 返回删除后的链表的头节点。 注意&#xff1a;此题对比原题有改动 示例 1: 输入: head [4,5,1,9], val 5 输出: [4,1,9] 解释: 给定你链表中值为 5 的第二个节点&#xff0c;那么…

因为工资补贴邮件被划空银行卡?搜狐全体员工被诈骗始末

文 | 小戏“叮~”如果你的手机弹出了新邮件提示&#xff0c;弹窗显示【xx公司财务部】关于发布最新工资补贴通知……&#xff0c;你会怎么想&#xff1f;当我看到了正确的公司名&#xff0c;与或许有一定道理的工资补贴&#xff0c;这些信息还是会驱使我带着疑惑打开邮件&#…

剑指Offer - 面试题24. 反转链表(遍历/递归)

1. 题目 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL限制&#xff1a; 0 < 节点个数 < 5000来源&#xff1a;力扣&…

我是粉红猪佩奇,我要把粉色吹风机写进 IJCAI 论文!

文 | 智商掉了一地当小猪佩奇的忠实观众进行AI研究&#xff0c;论文配图居然是这样的风格……在介绍接下来的内容前&#xff0c;我们先来看一则笑话&#xff1a;小猪佩奇哭着对妈妈说&#xff1a;“小伙伴们都说我长得像粉色吹风机。” 猪妈妈安慰道&#xff1a;“尽瞎说&#…

Spring Boot 2.x基础教程:快速入门

简介 在您第1次接触和学习Spring框架的时候&#xff0c;是否因为其繁杂的配置而退却了&#xff1f;在你第n次使用Spring框架的时候&#xff0c;是否觉得一堆反复黏贴的配置有一些厌烦&#xff1f;那么您就不妨来试试使用Spring Boot来让你更易上手&#xff0c;更简单快捷地构建…

剑指Offer - 面试题64. 求1+2+…+n(递归)

1. 题目 求 12…n &#xff0c;要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句&#xff08;A?B:C&#xff09;。 示例 1&#xff1a; 输入: n 3 输出: 6示例 2&#xff1a; 输入: n 9 输出: 45限制&#xff1a; 1 < n < 10000来源&…

AI社区炸锅了!一句话哄一哄就能让GPT-3准确率暴涨61%!

文 | 梦晨 明敏 发自 凹非寺源 | 量子位一觉醒来&#xff0c;机器学习社区炸了锅。因为最新研究发现&#xff0c;只要对GPT-3说一句“让我们一步一步地思考”&#xff0c;就能让它正确回答出以前不会的问题。比如下面这个例子&#xff1a;16个球中有一半是高尔夫球&#xff0c;…

全网Star最多(近20k)的Spring Boot开源教程 2019 年要继续更新了!

从2016年1月开始写博客&#xff0c;默默地更新《Spring Boot系列教程》&#xff0c;从无人问津到千万访问&#xff0c;作为一个独立站点&#xff08;http://blog.didispace.com&#xff09;&#xff0c;相信只有那些跟我一样&#xff0c;坚持维护自己独立博客的童鞋才能体会这有…

剑指Offer - 面试题65. 不用加减乘除做加法(位运算,要看哦)

1. 题目 写一个函数&#xff0c;求两个整数之和&#xff0c;要求在函数体内不得使用 “”、“-”、“*”、“/” 四则运算符号。 示例: 输入: a 1, b 1 输出: 2提示&#xff1a; a, b 均可能是负数或 0 结果不会溢出 32 位整数来源&#xff1a;力扣&#xff08;LeetCode&am…

Spring Boot中如何扩展XML请求和响应的支持

在之前的所有Spring Boot教程中&#xff0c;我们都只提到和用到了针对HTML和JSON格式的请求与响应处理。那么对于XML格式的请求要如何快速的在Controller中包装成对象&#xff0c;以及如何以XML的格式返回一个对象呢&#xff1f; 实现原理&#xff1a;消息转换器&#xff08;M…