利用Swagger2自动生成对外接口的文档
一直以来做对外的接口文档都比较原始,基本上都是手写的文档传来传去,最近发现了一个新玩具,可以在接口上省去不少麻烦。
swagger是一款方便展示的API文档框架。它可以将接口的类型最全面的展示给对方开发人员,避免了手写文档的片面和误差行为。
swagger目前有两种swagger和swagger2两种,1比较麻烦,所以不考虑使用。本文主要记录我用swagger2做对外接口的两种方式,方面后面查阅。
一、使用传统的springmvc整合swagger2
1、maven依赖
<!--springfox依赖-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.6.</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.6.</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.4.</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.4.</version>
</dependency>
2、spring-mvc.xml 中添加映射静态的配置(其实我项目中把这个去掉也可以,不知道什么情况):
<!-- swagger静态文件路径 -->
<mvc:resources location="classpath:/META-INF/resources/" mapping="swagger-ui.html"/>
<mvc:resources location="classpath:/META-INF/resources/webjars/" mapping="/webjars/**"/>
注意:基本的springmvc配置我就不贴了,需要注意的是,如果你看到swagger-ui.html 界面出来,但却一片空白,请检查下你web.xml中拦截器的配置,一定要springmvc先拦截到,然后界面才会显示的。
3、然后是swagger2的配置类:
@Configuration
@EnableSwagger2
public class SwaggerConfig extends WebMvcConfigurationSupport { @Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("net.laoyeyey.yyblog"))
.paths(PathSelectors.any())
.build();
} private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("yyblog项目 RESTful APIs")
.description("yyblog项目api接口文档")
.version("1.0")
.build();
}
}
注意:paths如果在生产情况下可以调整为PathSelectors.none(),即不显示所有接口信息;
4、接口信息配置
即在SpringMvc的Controller中配置相关的接口信息
@Controller
@RequestMapping(value = "aitou")
@Api(description = "测试服务-账户信息查询")
public class DailyOperationDataController {
Logger logger = Logger.getLogger(DailyOperationDataController.class);
@Autowired
private DailyOperationDataService DailyOperationDataService;
/*
* @ApiOperation(value = "接口说明", httpMethod ="接口请求方式", response ="接口返回参数类型", notes ="接口发布说明"
* @ApiParam(required = "是否必须参数", name ="参数名称", value ="参数具体描述"
*/
@ApiOperation(value = "账户信息查询接口")
@RequestMapping(method ={RequestMethod.POST,RequestMethod.GET}, value="/query/dailydata/{dataDate}")
@ResponseBody
public DailyOperationDataDto getDailyReportByDataDate(@PathVariable("dataDate") String dataDate) {
try {
return DailyOperationDataService.getDailyReportByDataDate(dataDate);
} catch (Exception e) {
logger.error(e.getMessage(), e);
} return null;
} }
注:通常情况下swagger2会将扫描包下所有的接口展示出来,这里我是对外的接口是单独一个包,避免展示过多的接口,当然接口方法也可以让它不展示。可以在下面看到相关的注解中有写。
常用的一些注解
@Api:用在类上,说明该类的作用
@ApiOperation:用在方法上,说明方法的作用
@ApiImplicitParams:用在方法上包含一组参数说明
@ApiImplicitParam:用在 @ApiImplicitParams 注解中,指定一个请求参数的各个方面
paramType:参数放在哪个地方
· header --> 请求参数的获取:@RequestHeader
· query -->请求参数的获取:@RequestParam
· path(用于restful接口)--> 请求参数的获取:@PathVariable
· body(不常用)
· form(不常用)
name:参数名
dataType:参数类型
required:参数是否必须传
value:参数的意思
defaultValue:参数的默认值
@ApiResponses:用于表示一组响应
@ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息
code:数字,例如400
message:信息,例如"请求参数没填好"
response:抛出异常的类
@ApiParam:单个参数描述
@ApiModel:描述一个Model的信息,用对象来接收参数(这种一般用在post创建的时候,使用@RequestBody这样的场景,请求参数无法使用@ApiImplicitParam注解进行描述的时候)
@ApiModelProperty:描述一个model的属性
@ApiProperty:用对象接收参数时,描述对象的一个字段
@ApiIgnore:使用该注解忽略这个API
基本上就是上面这些了,是不是很easy,下面看下效果图
二、使用springboot整合swagger2
上面说了使用传统的springmvc整合swagger2,在说说最近比较流行的springboot的方式,其实原理都是一样的。
1、maven依赖
<!--springfox依赖 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
这个是我最近用springboot写的个人项目中的内用,版本用的2.7.0
2、添加静态资源配置
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {/**
* 配置静态资源路径以及上传文件的路径
*
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
registry.addResourceHandler("/upload/**").addResourceLocations(environment.getProperty("spring.resources.static-locations"));
/*swagger-ui*/
registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
} }
其实就是最后两句,如果你不配置这个的话,访问swagger-ui.html会出现500,还是404的错误来着,记不清了,应该是404.
3、swagger2的配置类
和上面一样,基本上没区别
@Configuration
@EnableSwagger2
@EnableWebMvc
public class SwaggerConfig extends WebMvcConfigurationSupport { @Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("net.laoyeye.yyblog.web.frontend"))
.paths(PathSelectors.none())
.build();
} private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("yyblog项目 RESTful APIs")
.description("yyblog项目api接口文档")
.version("1.0")
.build();
} }
注意,我上面有说path的问题哦,直接拷贝不显示api的,(#^.^#)
4、接口的配置
/**
* 前台文章Controller
* @author 小卖铺的老爷爷
* @date 2018年5月5日
* @website www.laoyeye.net
*/
@Api(description="文章查询")
@Controller
@RequestMapping("/article")
public class ArticleController {
@Autowired
private ArticleService articleService;
@Autowired
private SettingService settingService;
@Autowired
private CateService cateService;
@Autowired
private TagReferService tagReferService;
@Autowired
private UserService userService;
@Autowired
private ArticleMapper articleMapper;
@Autowired
private CommentService commentService; @ApiOperation(value="文章查询接口")
@ApiImplicitParam(name = "id", value = "文章ID", required = true, dataType = "Long")
@GetMapping("/{id}")
public String index(Model model, @PathVariable("id") Long id) {
try {
articleService.updateViewsById(id);
} catch (Exception ignore) {
}
List<Setting> settings = settingService.listAll();
Map<String,Object> map = new HashMap<String,Object>();
for (Setting setting : settings) {
map.put(setting.getCode(), setting.getValue());
}
Article article = articleService.getArticleById(id);
model.addAttribute("settings", map);
model.addAttribute("cateList", cateService.listAllCate());
model.addAttribute("article", article);
model.addAttribute("tags", tagReferService.listNameByArticleId(article.getId()));
model.addAttribute("author", userService.getNicknameById(article.getAuthorId()));
//回头改
model.addAttribute("articles", articleMapper.listArticleByTitle(null));
model.addAttribute("similars", articleMapper.listArticleByTitle(null));
CommentQuery query = new CommentQuery();
query.setLimit(10);
query.setPage(1);
query.setArticleId(id);
model.addAttribute("comments", commentService.listCommentByArticleId(query));
return "frontend/article";
} @ApiOperation(value="文章评论查询接口")
@PostMapping("/comments")
@ResponseBody
public DataGridResult comments(CommentQuery query) {
//设置默认10
query.setLimit(10);
return commentService.listCommentByArticleId(query);
} @ApiOperation(value="文章点赞接口")
@ApiImplicitParam(name = "articleId", value = "文章ID", required = true, dataType = "Long")
@PostMapping("/approve")
@ResponseBody
public YYBlogResult approve(@RequestParam Long articleId) {
return articleService.updateApproveCntById(articleId);
}
}
最后同样来个效果图,和上面一样。
PathSelectors.none()的时候
PathSelectors.any()的时候
看到效果图是不是接口内容一目了然,很简洁明了了。
最后,好像忘记说swagger文档的路径了
如果你的项目在根目录:http://localhost:8080/swagger-ui.html
如果不是根目录那就是:http://localhost:8080/你的项目名/swagger-ui.html
实例地址:http://www.laoyeye.net/management/index 账号/密码:test/123456 菜单:系统设置/接口文档
源码地址:https://github.com/allanzhuo/yyblog
利用Swagger2自动生成对外接口的文档的更多相关文章
- SpringBoot + Swagger2 自动生成API接口文档
spring-boot作为当前最为流行的Java web开发脚手架,相信越来越多的开发者会使用其来构建企业级的RESTFul API接口.这些接口不但会服务于传统的web端(b/s),也会服务于移动端 ...
- 【工具篇】利用DBExportDoc V1.0 For MySQL自动生成数据库表结构文档
对于DBA或开发来说,如何规范化你的数据库表结构文档是灰常之重要的一件事情.但是当你的库,你的表排山倒海滴多的时候,你就会很头疼了. 推荐一款工具DBExportDoc V1.0 For MySQL( ...
- 自动生成并导出word文档
今天很荣幸又破解一现实难题:自动生成并导出word文档 先看页面效果: word效果: 代码: 先搭建struts2项目 创建action,并在struts.xml完成注册 <?xml vers ...
- 基于数据库的自动化生成工具,自动生成JavaBean、数据库文档、框架代码等(v5.8.8版)
TableGo v5.8.8版震撼发布,此次版本更新如下: 1.新增两个扩展字段,用于生成自定义模板时使用. 2.自定义模板新增模板目录,可以选择不同分类目录下的模 ...
- 利用ShowDoc自动生成api接口文档
最近在做新项目,感觉写完一个接口 还要去再写一遍api文档 挺浪费时间的,所以借用ShowDoc的api开放功能 自动生成api文档. 首先 去 https://www.showdoc.cc/ 注册一 ...
- 利用DBExportDoc V1.0 For MySQL自动生成数据库表结构文档
对于DBA或开发来说,如何规范化你的数据库表结构文档是灰常之重要的一件事情.但是当你的库,你的表排山倒海滴多的时候,你就会很头疼了. 推荐一款工具DBExportDoc V1.0 For MySQL( ...
- oracle数据库自动生成数据库表结构文档(亲测有效)
import java.awt.Color; import java.io.FileOutputStream; import java.sql.Connection; import java.sql. ...
- SpringBoot入门教程(二十)Swagger2-自动生成RESTful规范API文档
Swagger2 方式,一定会让你有不一样的开发体验:功能丰富 :支持多种注解,自动生成接口文档界面,支持在界面测试API接口功能:及时更新 :开发过程中花一点写注释的时间,就可以及时的更新API文档 ...
- [Dynamic Language] 用Sphinx自动生成python代码注释文档
用Sphinx自动生成python代码注释文档 pip install -U sphinx 安装好了之后,对Python代码的文档,一般使用sphinx-apidoc来自动生成:查看帮助mac-abe ...
随机推荐
- 安卓TV开发(三) 移动智能设备之实现主流TV电视盒子焦点可控UI
前言:移动智能设备的发展,推动了安卓另一个领域,包括智能电视和智能家居,以及可穿戴设备的大量使用,但是这些设备上的开发并不是和传统手机开发一样,特别是焦点控制和用户操作体验上有很大的区别,本系列博文主 ...
- StarUML添加自定义approach和profile
来源:fasiondog 添加Approch StarUML中的Approch也就是创建项目时的模板,其中预定义了所使用方法的模型和视图.StarUML默认Approach如下: StarUML的Ap ...
- OSB开发常用资料
成功搭建OSB环境并运行HelloWorld项目 http://www.beansoft.biz/?p=2066 Oracle Service Bus 11gR1开发环境安装文档 http://www ...
- php 运行linux命令 与 linux下命令行执行php
1.php运行linux命令 exec函数:string exec(string command, string [array], int [return_var]); 执行函数后不输出结果,返回最 ...
- java注解及在butternife中的实践和原理
1. 背景 之前去一个公司,说到了java的注解,问java的注解有几种方式,然后我提到了android中的butternife和afinal注解工具,我们知道butternife在6.1版本的时候 ...
- XMPP系列(五)---文件传输
xmpp中发送文件和接收文件的处理有些不太一样,接收文件处理比较简单,发送稍微复杂一些. 首先需要在XMPPFramework.h中添加文件传输类 //文件传输 //接收文件 #import &quo ...
- OpenCV——颜色运算
#ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include <iostream> #include & ...
- 对于CocoaPods的简单理解,实践安装使用过程和常见问题
(本文是自己通过其他文章进行的自我编辑和简单修改,请大家凑活看看) 一.什么是CocoaPods CocoaPods是iOS项目的依赖管理工具,该项目源码在Github上管理.开发iOS项目不可避免地 ...
- IT轮子系列(五)——MVC API 文件上传,总有一款是你需要的
前言 在对外提供的接口时,也常常需要提供上传文件的.在这篇文章中会描述三种上传方式. 1.第一款,通过Base64字符上传——PostFromBase64Str 首先,定义上传数据模型.对于模型的定义 ...
- SPRING事务的属性有哪些?其中,事务隔离级别有哪几种?什么情况需要使用这几种事务隔离级别?
Spring 声明式事务,propagation属性列表 PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务.这是最常见的选择. PROPAGATION_SU ...