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 ...
随机推荐
- RxVolley使用文档 —— RxVolley = Volley + RxJava + OkHttp
RxVolley使用文档 -- RxVolley = Volley + RxJava + OkHttp 偶然有幸,看到这个框架,便深深的爱上了这个框架,赶紧转载一发到自己的博客上温故而知新,而且作者一 ...
- 多层界面之间显示与隐藏tabBar
IOS中多层界面之间显示与隐藏tabBar? 在做项目的时候,遇到了一个难题,使用hidesBottomWhenPushed=YES属性设置,可以让本级界面及其以后界面都隐藏,但是根据项目 需求,在第 ...
- 【翻译】如何在Ext JS 6中使用Fashion美化应用程序
原文:How to Style Apps with Fashion in Ext JS 6 在Ext JS 6,一个最大的改变就是框架合并,使用一个单一的代码库,就可以为每一种设备开发各具有良好体验的 ...
- JAVA之旅(八)——多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例
JAVA之旅(八)--多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例 学习是不能停止的 一.多态 我们今天又要学习一个新的概念了,就是多态,它是面向对象的第 ...
- GIT版本控制 — GIT与SVN的相互转换 (三)
git-svn git-svn用于Git和SVN的转换,可以把Git仓库迁移成SVN仓库,反之亦可. 详细介绍可见[1],或者命令行输入git-svn. Bidirectional operation ...
- 网站开发进阶(二十一)Angular项目信息错位显示问题解决
Angular项目信息错位显示问题解决 绪 最近在项目开发过程中遇到这样一个棘手的问题:查询出所有订单信息后,点击选择某一个订单,查询出的结果是上一次查询所得的结果.而且会出现点击两次才可以显示订单详 ...
- 三消游戏FSM状态机设计图
三消游戏FSM状态机设计图 1) 设计FSM图 2) smc配置文件 ///////////////////////////////////////////////////////////////// ...
- DEVICE_ATTR
说道sysfs接口,就不得不提到函数宏 DEVICE_ATTR,原型是 #define DEVICE_ATTR(_name, _mode, _show, _store) \ struct device ...
- boost::this_thread::sleep_for()死锁
boost::this_thread::sleep_for()会死锁 (金庆的专栏) 发现睡眠1ms很容易死锁.boost::this_thread::sleep_for(boost::chrono: ...
- mybatis源码之StatementHandler
/** * @author Clinton Begin */ public interface StatementHandler { Statement prepare(Connection conn ...