分享一个集成在项目中的REST APIs文档框架swagger
1 为什么是使用swagger?
1-1 当后台开发人员开发好接口,是不是还要重新书写一份接口文档提给前端人员,当然对于程序员最不喜欢的就是书写文档(当然文档是必须的,有利于项目的维护)
1-2 当后台人员开发接口,当然后台开发者也是需要测试好接口是否可用,当参数少的时候测试还不是很麻烦,当参数有十多个的时候,就需要后台开发者一个一个的拼接参数,很是耗时间而且还容易写错参数名,swagger就很好解决了这个问题(当然也是可以借助其他插件:rest-client工具,PostMan)
2 搭建环境:window,spring boot,swaager,maven
3 开始搭建:搭建过程很简单,有关于swagger注解本文不详细叙述,其实只使用常用的几个注解就ok了(@ApiOperation,@EnableSwagger2,@Api)
3-1 导入必须jar包 ,修改pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>RELEASE</version>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency> <!-- swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version> 2.6.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version> 2.6.0</version>
</dependency>
<!-- swagger end -->
3-2 配置swagger
@Configuration
@EnableSwagger2 //swagger注解
public class SwaggerConfig { @Bean
public Docket allInterface() {
return new Docket(DocumentationType.SWAGGER_2).groupName("AllInterface(所有接口)")// 定义组
.select() // 选择那些路径和api会生成document
.apis(RequestHandlerSelectors.basePackage("com.lishun.controller")) // 拦截的包路径
.paths(regex("/.*"))// 拦截的接口路径
.build() // 创建
.apiInfo(apiInfo())// 配置说明
.tags(new Tag("index", "起始页"), getTags());
}
/**
* @Description:这里可以指定其他tag(对应controller的@Api注解的tags属性值)
* @author lishun
* @date 2018/2/28
* @param []
* @return springfox.documentation.service.Tag[]
*/
private Tag[] getTags() {
Tag[] tags = { new Tag("login", "登录相关") };
return tags;
} private ApiInfo apiInfo() {
return new ApiInfoBuilder()//
.title("swagger api 文档")// 标题
.description("swagger api 文档")// 描述
.termsOfServiceUrl("")//
.contact(new Contact("", "", ""))// 联系
.version("1.0")// 版本
.build();
}
}
3-3 统一所有接口返回值(便于前端人员开发,和统一处理controller异常)
public class ResultBean<T> implements Serializable {
/*提示信息*/
public String message = "";
/*状态码*/
public Integer code;
/*总页数*/
private long totalPage;
/*页容量*/
private int pages;
/*页码*/
private int pageNum;
/*返回实体信息*/
private T resultData;
/*返回集合实体信息*/
private List<T> resultDataList;
public ResultBean() {
}
public ResultBean(List<T> resultData, long totalPage, int pages, int pageNum) {
this.resultDataList = resultData;
this.totalPage = totalPage;
this.pages = pages;
this.pageNum = pageNum;
}
public ResultBean(T resultData) {
this.resultData = resultData;
}
public void setMessage(String message) {
this.message = message;
}
public long getTotalPage() {
return totalPage;
}
public void setTotalPage(long totalPage) {
this.totalPage = totalPage;
}
public int getPages() {
return pages;
}
public void setPages(int pages) {
this.pages = pages;
}
public int getPageNum() {
return pageNum;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
public List<T> getResultDataList() {
return resultDataList;
}
public void setResultDataList(List<T> resultDataList) {
this.resultDataList = resultDataList;
}
public void setMessage(String message, Object... args) {
this.message = String.format(message, args);
}
public String getMessage() {
return message;
}
public void setResultData(T resultData) {
this.resultData = resultData;
}
public T getResultData() {
return this.resultData;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public <T> void setResultBean(Integer code, String message,
Object... mesaageFormatArgs) {
setCode(code);
setMessage(message, mesaageFormatArgs);
}
}
3-4 统一处理controller异常
/**
* @author lishun
* @Description: 控制器aop拦截
* @date 2017/10/27
*/
@Component
@Aspect
public class ControllerAspect {
@Pointcut("execution(public com.lishun.result.ResultBean com.lishun.controller.*.*(..))")
public void dataSource(){}; @Around("dataSource()")
public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
ResultBean result = null;
try {
result = (ResultBean<?>)proceedingJoinPoint.proceed();
} catch (Exception e) {
result = new ResultBean();
result.setCode(ResultCode.FAILED);
result.setMessage(e.getMessage());
e.printStackTrace();
}
return result;
}
}
3-4 contrlloer
@RestController
@Api(tags = { "index" })
public class IndexController { @GetMapping("/index/{id}")
@ApiOperation(value = "findByOne", notes = "获取一条数据")
public ResultBean<String> findByOne(@PathVariable(value = "id") String id) {
ResultBean<String> resultBean = new ResultBean<>();
resultBean.setCode(ResultCode.OK);
resultBean.setResultData("请求成功");
return resultBean;
}
@PostMapping("/index/add")
@ApiOperation(value = "add", notes = "新增")
public ResultBean<String> add(Users users) {
ResultBean<String> resultBean = new ResultBean<>();
resultBean.setCode(ResultCode.OK);
resultBean.setResultData("请求成功");
return resultBean;
}
@DeleteMapping("/index/delete/{id}")
@ApiOperation(value = "delete", notes = "删除")
public ResultBean<String> delete(@PathVariable(value = "id") String id) {
ResultBean<String> resultBean = new ResultBean<>();
resultBean.setCode(ResultCode.OK);
resultBean.setResultData("请求成功");
return resultBean;
}
}
3-5 测试
主要是测试接口api,所以这里就没有数据库访问的业务逻辑层
启动项目,访问http://localhost:8080/swagger-ui.html#/

展开add接口

3-6 注意!!!!! 生成环境需要把swagger禁用,swagger只是适合在开发和测试环境中使用,源代码
分享一个集成在项目中的REST APIs文档框架swagger的更多相关文章
- 使用Swagger2构建SpringMVC项目中的Restful API文档
使用Swagger自动生成API文档,不仅增加了项目的可维护性,还提高了API的透明度更利于快速测试等工作,便于更快地发现和解决问题. 本篇文章只记录整合过程,关于Security Configura ...
- 分享我在 vue 项目中关于 api 请求的一些实现及项目框架
本文主要简单分享以下四点 如何使用 axios 如何隔离配置 如何模拟数据 分享自己的项目框架 本文主要目的为以下三点 希望能够帮到一些人 希望能够得到一些建议 奉上一个使用Vue的模板框架 我只是把 ...
- .NET平台开源项目速览(4).NET文档生成工具ADB及使用
很久以前就使用ADB这个工具来生成项目的帮助文档.功能强大,在学习一些开源项目的过程中,官方没有提供CHM帮助文档,所以为了快速的了解项目结构和注释.就生成文档来自己看,非常好用.这也是一个学习方法吧 ...
- API文档工具-Swagger的集成
最近安装了API文档工具swagger,因为Github上已有详细安装教程,且安装过程中没有碰到大的阻碍,所以此文仅对这次安装做一份大致记录 相关网站 Swagger 官方地址: http://swa ...
- 如何在ASP.NET Core 中快速构建PDF文档
比如我们需要ASP.NET Core 中需要通过PDF来进行某些简单的报表开发,随着这并不难,但还是会手忙脚乱的去搜索一些资料,那么恭喜您,这篇帖子会帮助到您,我们就不会再去浪费一些宝贵的时间. 在本 ...
- Springboot中整合knife4j接口文档
在项目开发过程中,web项目的前后端分离开发,APP开发,需要由前端后端工程师共同定义接口,编写接口文档,之后大家都根据这个接口文档进行开发. 什么是knife4j 简单说knife4j就swagge ...
- 在我的电脑中删除wps云文档图标
在我的电脑中删除wps云文档图标 右键点击win10左下角选择运行,输入regedit打开注册表后,找到以下注册表路径: HKEY_CURRENT_USER\Software\Microsoft\Wi ...
- 分享一个集成.NET Core+Swagger+Consul+Polly+Ocelot+IdentityServer4+Exceptionless+Apollo+SkyWalking的微服务开发框架
集成.NET Core+Swagger+Consul+Polly+Ocelot+IdentityServer4+Exceptionless+Apollo的微服务开发框架 Github源代码地址 htt ...
- 分享一个CQRS/ES架构中基于写文件的EventStore的设计思路
最近打算用C#实现一个基于文件的EventStore. 什么是EventStore 关于什么是EventStore,如果还不清楚的朋友可以去了解下CQRS/Event Sourcing这种架构,我博客 ...
随机推荐
- [转] Freemarker的常用技巧总结
1,截取字符串 有的时候我们在页面中不需要显示那么长的字符串,比如新闻标题,这样用下面的例子就可以自定义显示的长度 < lt. <= lte. > gt. >= gte < ...
- 新手数据比赛中数据处理方法小结(python)
第一次参加,天池大数据竞赛(血糖预测),初赛排名1%.因为自己对python不熟悉,所以记录一下在比赛中用到的一些python方法的使用(比较基础细节,大佬绕道): 1.数据初探 data.info( ...
- linux 从softnet_stat查看内核丢包信息
1.从系统整体来考虑,通过netstat 查看: [root@localhost net]# netstat -s |grep drop 3168 outgoing packets dropped 1 ...
- linux pagecache限制与查看
在linux服务器使用过程中,由于linux对内存的使用原则是能cache就尽量cache,所以会出现pagecache占用很多的情况. suse的版本有一个pagecachelimit的功能,cen ...
- .net core 1.0 中的asp.net identity 基本使用(二)
一.重写(覆盖)身份验证数据类型 1.修改Models目录中的ApplicationUser.cs类文件,如下 namespace xxxx.Models { //将应用程序用户的属性添加到应用程序 ...
- 用 chrome 调试 node.js 代码
1.全局安装 node-inspector cnpm install -g node-inspector 2.启动node项目入口文件,如 node --inspect index.js 3.控制台 ...
- promise使用方法
代码报错会走向失败时的回调 let p = new Promise((resolve, reject) => { throw new Error("我错了"); //会失败 ...
- 2018-02-03-jekyll框架下的post如何显示图片
layout: post title: 2018-02-03-jekyll框架下的post如何显示图片 key: 20180203 tags: blog post modify_date: 2018- ...
- java 对象、集合的非空判断
自我总结,有什么不到位的地方,请各位纠正补充,感激不尽! 目的:使程序更严谨 ***对象验证是否不为空: if( null != obj ) ***List验证不为空:if( null != lis ...
- vs2012编译在win7 32位电脑和win xp电脑上运行的win32程序遇到的问题记录
一.win7 32位电脑: vs2012编译的64位程序是没有问题的.但编译的32位程序在别的电脑(虚拟机模拟)出错: 感觉很无语,vs这么牛逼的东西,在设计时候都不考虑这些吗? 在自己电脑C:\Wi ...