springmvc+swagger构建Restful风格文档
本次和大家分享的是java方面的springmvc来构建的webapi接口+swagger文档;上篇文章分享.net的webapi用swagger来构建文档,因为有朋友问了为啥.net有docpage文档你还用swagger,这里主要目的是让接口文档统一,当操作多种开发语言做接口时,如果有统一风格的api文档是不是很不错;还有就springcloude而言,微服务如果有很多的话,使用swagger自动根据服务serverid来加载api文档是很方便的。swagger设置比较简单,为了今后查找资料和使用方便故此记录下
- 准备工作
- 快速构建api文档
- 常用的细节
- 过滤默认错误api
- 添加授权token列
- 添加上传文件列
准备工作
首选需要一个springmvc项目,这里我用的是springboot+maven来快速构建, 要使用swagger只需要在maven中添加依赖包就行:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.6.</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.6.</version>
</dependency>
然后创建一个UserController,然后再定义个Login的Action,定义请求和响应实体,由于api接口需要对请求和响应属性列做 文字描述,并且上面我们在项目中加了swagger包,因此以直接在实体和Action使用特性来增加具体文字描述:
@RestController
@Api(tags = "会员接口")
public class UserController { @PostMapping("/login")
@ApiOperation(value = "登录")
public LoginRp login(@RequestBody LoginRq rq) {
LoginRp rp = new LoginRp(); if (rq.getUserName().isEmpty() || rq.getUserPwd().isEmpty()) {
rp.setCode(EmApiCode.登录账号或密码不能为空.getVal());
return rp;
} if (rq.getUserName().equals("shenniu001") && rq.getUserPwd().equals("")) {
rp.setCode(EmApiCode.成功.getVal()); rp.setToken(UUID.randomUUID().toString());
} else {
rp.setCode(EmApiCode.失败.getVal());
}
return rp;
} }
请求和响应实体类:
@ApiModel
public class LoginRq implements Serializable{ private static final long serialVersionUID = -158328750073317876L; @ApiModelProperty(value = "登录账号")
private String userName; @ApiModelProperty(value = "登录密码")
private String userPwd; } @ApiModel
public class LoginRp extends BaseRp implements Serializable {
private static final long serialVersionUID = -1486838360296425228L; @ApiModelProperty(value = "授权token")
private String token; public String getToken() {
return token;
} public void setToken(String token) {
this.token = token;
}
}
注解简单说明:
@Api:同一类接口的总描述,一般用于Controller标记
@ApiOperation(value = "登录"):在Action上标记,描述这个Action接口具体干什么
@ApiModel:请求响应实体类class上的标记
@ApiModelProperty(value = "登录账号"):请求响应属性上的标记,用来描述该属性具体说明
快速构建api文档
准备做完后要生成文档,还需要自定义两个封装类,如下Swagger2类:
@Configuration
@EnableSwagger2
public class Swagger2 { @Bean
public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2)
.select()
//过滤默认错误api
.paths(Predicates.not(PathSelectors.regex("/error.*")))
.build()
.apiInfo(apiInfo());
} //常用的细节
//过滤指定的action
//添加授权token列
//添加上传文件列
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("开车接口文档")
.description("该文档只允许我使用")
//版本
.version("0.0.0.1")
.contact("作者:841202396@qq.com")
.build();
}
}
这个类主要初始化一些全局文档的说明和版本并且构架api文档;上面是生成文档,但是具体文档数据源用从swagger的SwaggerResourcesProvider中来,因此自定义的DocumentationConfig类实现SwaggerResourcesProvider接口,如下:
@Component
@Primary
public class DocumentationConfig implements SwaggerResourcesProvider {
@Override
public List<SwaggerResource> get() {
List resources = new ArrayList<>();
resources.add(swaggerResource("开车接口api", "/v2/api-docs", "0.0.0.1"));
resources.add(swaggerResource("坐车接口api", "/v2/api-docs", "0.0.0.1"));
return resources;
} private SwaggerResource swaggerResource(String name, String location, String version) {
SwaggerResource swaggerResource = new SwaggerResource();
swaggerResource.setName(name);
swaggerResource.setLocation(location);
swaggerResource.setSwaggerVersion(version);
return swaggerResource;
}
}
主要加载文档的数据源,数据源主要通过 resources.add(swaggerResource("坐车接口api", "/v2/api-docs", "0.0.0.1")) 添加,倘若你想添加其他api接口源就可以在这里进行配置,直接把/v2/api-docs改成你的url就行,这个地方也是springcloud微服务api添加的入口;当编码完成后我们来看看效果:

能成功加载出我们的login接口,而且有一些说明性的文字;再来看看我们请求和响应的参数是否有说明:

请求和响应都有了相应的说明,是不是挺简单;
常用的细节
1.过滤默认错误api
由于springmvc封装有错误的controller,因此swagger也会把这个展示出来,因为是扫描的所有controller来展示swagger文档的,故此我们需要屏蔽这些对于对接方没用的接口;这里通过设置paths的不匹配就行了,以下代码:
//过滤默认错误api
paths(Predicates.not(PathSelectors.regex("/error.*")))
2.添加授权token列
对于接口验证来说通常需要个token并且放在header里面,这里我们直接在swagger上增加一个显示的token,只需要在build之前增加一个header参数:
@Bean
public Docket createRestApi() { List<Parameter> pars = new ArrayList<>();
//添加授权token
ParameterBuilder tokenPar = new ParameterBuilder();
tokenPar.name("token").description("授权token 注:登录不需要填,只有post方式的接口必填").
modelRef(new ModelRef("string")).
parameterType("header").required(false).build();
pars.add(tokenPar.build()); return new Docket(DocumentationType.SWAGGER_2)
.select()
.paths(Predicates.not(PathSelectors.regex("/error.*")))
.build()
.globalOperationParameters(pars)
.apiInfo(apiInfo());
}
这个时候每个action接口文档块中都会增加一个token列,type是header类型:

3.添加上传文件列
通常api接口都包含一个公共上传接口,为了让swagger文档更方便,我们需要让她支持下上传;首先这样定义一个上传接口:
@PostMapping(value = "/upload",headers = "content-type=multipart/form-data")
@ApiOperation(value = "上传")
public BaseRp upload(@ApiParam(value = "上传的文件",required = true) @RequestBody MultipartFile file) {
BaseRp rp = new BaseRp(); rp.setMessage("上传文件名:"+file.getOriginalFilename()); return rp;
}
其他就不用再设置了,仅仅如此运行后效果:

咋们点击“选择文件”测试下上传,点击try能够得到如下成功运行的效果图:

springmvc+swagger构建Restful风格文档的更多相关文章
- 使用Swashbuckle构建RESTful风格文档
本次和大家分享的是Swagger to WebApi的nuget包Swashbuckle:因为项目需要统一api文档的风格,并要支持多种开发语言(C#,java,python),所以首先想到的是swa ...
- Spring Boot 集成 Swagger 生成 RESTful API 文档
原文链接: Spring Boot 集成 Swagger 生成 RESTful API 文档 简介 Swagger 官网是这么描述它的:The Best APIs are Built with Swa ...
- Spring Boot 入门系列(二十二)使用Swagger2构建 RESTful API文档
前面介绍了如何Spring Boot 快速打造Restful API 接口,也介绍了如何优雅的实现 Api 版本控制,不清楚的可以看我之前的文章:https://www.cnblogs.com/zha ...
- springboot集成swagger2构建RESTful API文档
在开发过程中,有时候我们需要不停的测试接口,自测,或者交由测试测试接口,我们需要构建一个文档,都是单独写,太麻烦了,现在使用springboot集成swagger2来构建RESTful API文档,可 ...
- Spring Boot中使用Swagger2构建RESTful API文档
在开发rest api的时候,为了减少与其他团队平时开发期间的频繁沟通成本,传统做法我们会创建一份RESTful API文档来记录所有接口细节,然而这样的做法有以下几个问题: 1.由于接口众多,并且细 ...
- Swagger: 一个restful接口文档在线生成+功能测试软件
一.什么是 Swagger? Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件.Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 ...
- springMVC+json构建restful风格的服务
首先.要知道什么是rest服务,什么是rest服务呢? REST(英文:Representational State Transfer,简称REST)描写叙述了一个架构样式的网络系统.比方 web 应 ...
- Swagger+Spring mvc生成Restful接口文档
简介 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参数和模型紧密集 ...
- 使用Swagger2构建SpringMVC项目中的Restful API文档
使用Swagger自动生成API文档,不仅增加了项目的可维护性,还提高了API的透明度更利于快速测试等工作,便于更快地发现和解决问题. 本篇文章只记录整合过程,关于Security Configura ...
随机推荐
- 【一天一道LeetCode】#85. Maximal Rectangle
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- (六十三)自定义TabBar和TabBarButtonItem
自定义TabBar 先自定义一个UITabBarController,为了方便跳转与设定属性,借助系统的TabBarController的功能,但是要移除内部的控件然后自己添加一个View和多个按钮. ...
- 09_Android中ContentProvider和Sqllite混合操作,一个项目调用另外一个项目的ContentProvider
1. 编写ContentPrivider提供者的Android应用 清单文件 <?xml version="1.0" encoding="utf-8"? ...
- 《java入门第一季》之类StringBuffer类初步
/* * 线程安全(多线程分析) * 安全 -- 同步 -- 数据是安全的 * 不安全 -- 不同步 -- 效率高一些 * 安全和效率问题是永远困扰我们的问题. * 安全:医院的网站,银行网站 * 效 ...
- JSONP获取Twitter和Facebook文章数
原文链接: Retrieve Twitter and Facebook Counts with JSON 翻译人员: 铁锚 原文日期: 2014年02月19日 翻译日期: 2014年02月22日 !! ...
- 在多台PC上进行ROS通讯-学习笔记
首先,致谢易科(ExBot)和ROSWiki中文社区. 重要参考文献: Running ROS across multiple machines http://wiki.ros.org/ROS/Tut ...
- 自定义Interpolator
nterpolator这个东西很难进行翻译,直译过来的话是补间器的意思,它的主要作用是可以控制动画的变化速率,比如去实现一种非线性运动的动画效果.那么什么叫做非线性运动的动画效果呢?就是说动画改变的速 ...
- 【Qt编程】基于Qt的词典开发系列<十二>调用讲述人
我们知道,win7系统自带有讲述人,即可以机器读出当前内容,具体可以将电脑锁定,然后点击左下角的按钮即可.之前在用Matlab写扫雷游戏的时候,也曾经调用过讲述人来进行游戏的语音提示.具体的Matla ...
- HBase replication
Hbase Replication 介绍 现状 Hbase 的replication目前在业界使用并不多见,原因有很多方面,比如说HDFS目前已经有多份备份在某种程度上帮助HBASE底层数据的安全性, ...
- OpenCV meanshift 图像分割代码
参考:这个帖子的主要代码有错误,根据回帖改了一些 http://www.cnblogs.com/tornadomeet/archive/2012/06/06/2538695.html // means ...