一直以来做对外的接口文档都比较原始,基本上都是手写的文档传来传去,最近发现了一个新玩具,可以在接口上省去不少麻烦。

swagger是一款方便展示的API文档框架。它可以将接口的类型最全面的展示给对方开发人员,避免了手写文档的片面和误差行为。

swagger目前有两种swagger和swagger2两种,1比较麻烦,所以不考虑使用。本文主要记录我用swagger2做对外接口的两种方式,方面后面查阅。

一、使用传统的springmvc整合swagger2

1、maven依赖

  1. <!--springfox依赖-->
  2. <dependency>
  3. <groupId>com.fasterxml.jackson.core</groupId>
  4. <artifactId>jackson-core</artifactId>
  5. <version>2.8.</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>com.fasterxml.jackson.core</groupId>
  9. <artifactId>jackson-databind</artifactId>
  10. <version>2.6.</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>com.fasterxml.jackson.core</groupId>
  14. <artifactId>jackson-annotations</artifactId>
  15. <version>2.6.</version>
  16. </dependency>
  17. <dependency>
  18. <groupId>io.springfox</groupId>
  19. <artifactId>springfox-swagger2</artifactId>
  20. <version>2.4.</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>io.springfox</groupId>
  24. <artifactId>springfox-swagger-ui</artifactId>
  25. <version>2.4.</version>
  26. </dependency>

2、spring-mvc.xml 中添加映射静态的配置(其实我项目中把这个去掉也可以,不知道什么情况):

  1. <!-- swagger静态文件路径 -->
  2. <mvc:resources location="classpath:/META-INF/resources/" mapping="swagger-ui.html"/>
  3. <mvc:resources location="classpath:/META-INF/resources/webjars/" mapping="/webjars/**"/>

注意:基本的springmvc配置我就不贴了,需要注意的是,如果你看到swagger-ui.html 界面出来,但却一片空白,请检查下你web.xml中拦截器的配置,一定要springmvc先拦截到,然后界面才会显示的。

3、然后是swagger2的配置类:

  1. @Configuration
  2. @EnableSwagger2
  3. public class SwaggerConfig extends WebMvcConfigurationSupport {
  4.  
  5. @Bean
  6. public Docket createRestApi() {
  7. return new Docket(DocumentationType.SWAGGER_2)
  8. .apiInfo(apiInfo())
  9. .select()
  10. .apis(RequestHandlerSelectors.basePackage("net.laoyeyey.yyblog"))
  11. .paths(PathSelectors.any())
  12. .build();
  13. }
  14.  
  15. private ApiInfo apiInfo() {
  16. return new ApiInfoBuilder()
  17. .title("yyblog项目 RESTful APIs")
  18. .description("yyblog项目api接口文档")
  19. .version("1.0")
  20. .build();
  21. }
  22. }

注意:paths如果在生产情况下可以调整为PathSelectors.none(),即不显示所有接口信息;

4、接口信息配置

即在SpringMvc的Controller中配置相关的接口信息

  1. @Controller
  2. @RequestMapping(value = "aitou")
  3. @Api(description = "测试服务-账户信息查询")
  4. public class DailyOperationDataController {
  5. Logger logger = Logger.getLogger(DailyOperationDataController.class);
  6. @Autowired
  7. private DailyOperationDataService DailyOperationDataService;
  8. /*
    * @ApiOperation(value = "接口说明", httpMethod ="接口请求方式", response ="接口返回参数类型", notes ="接口发布说明"
    * @ApiParam(required = "是否必须参数", name ="参数名称", value ="参数具体描述"
       */
  9. @ApiOperation(value = "账户信息查询接口")
  10. @RequestMapping(method ={RequestMethod.POST,RequestMethod.GET}, value="/query/dailydata/{dataDate}")
  11. @ResponseBody
  12. public DailyOperationDataDto getDailyReportByDataDate(@PathVariable("dataDate") String dataDate) {
  13. try {
  14. return DailyOperationDataService.getDailyReportByDataDate(dataDate);
  15. } catch (Exception e) {
  16. logger.error(e.getMessage(), e);
  17. }
  18.  
  19. return null;
  20. }
  21.  
  22. }

注:通常情况下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依赖

  1. <!--springfox依赖 -->
  2. <dependency>
  3. <groupId>io.springfox</groupId>
  4. <artifactId>springfox-swagger2</artifactId>
  5. <version>2.7.0</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>io.springfox</groupId>
  9. <artifactId>springfox-swagger-ui</artifactId>
  10. <version>2.7.0</version>
  11. </dependency>

这个是我最近用springboot写的个人项目中的内用,版本用的2.7.0

2、添加静态资源配置

  1. @Configuration
  2. public class WebMvcConfig extends WebMvcConfigurerAdapter {/**
  3. * 配置静态资源路径以及上传文件的路径
  4. *
  5. * @param registry
  6. */
  7. @Override
  8. public void addResourceHandlers(ResourceHandlerRegistry registry) {
  9. registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
  10. registry.addResourceHandler("/upload/**").addResourceLocations(environment.getProperty("spring.resources.static-locations"));
  11. /*swagger-ui*/
  12. registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
  13. registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
  14. }
  15.  
  16. }

其实就是最后两句,如果你不配置这个的话,访问swagger-ui.html会出现500,还是404的错误来着,记不清了,应该是404.

3、swagger2的配置类

和上面一样,基本上没区别

  1. @Configuration
  2. @EnableSwagger2
  3. @EnableWebMvc
  4. public class SwaggerConfig extends WebMvcConfigurationSupport {
  5.  
  6. @Bean
  7. public Docket createRestApi() {
  8. return new Docket(DocumentationType.SWAGGER_2)
  9. .apiInfo(apiInfo())
  10. .select()
  11. .apis(RequestHandlerSelectors.basePackage("net.laoyeye.yyblog.web.frontend"))
  12. .paths(PathSelectors.none())
  13. .build();
  14. }
  15.  
  16. private ApiInfo apiInfo() {
  17. return new ApiInfoBuilder()
  18. .title("yyblog项目 RESTful APIs")
  19. .description("yyblog项目api接口文档")
  20. .version("1.0")
  21. .build();
  22. }
  23.  
  24. }

注意,我上面有说path的问题哦,直接拷贝不显示api的,(#^.^#)

4、接口的配置

  1. /**
  2. * 前台文章Controller
  3. * @author 小卖铺的老爷爷
  4. * @date 2018年5月5日
  5. * @website www.laoyeye.net
  6. */
  7. @Api(description="文章查询")
  8. @Controller
  9. @RequestMapping("/article")
  10. public class ArticleController {
  11. @Autowired
  12. private ArticleService articleService;
  13. @Autowired
  14. private SettingService settingService;
  15. @Autowired
  16. private CateService cateService;
  17. @Autowired
  18. private TagReferService tagReferService;
  19. @Autowired
  20. private UserService userService;
  21. @Autowired
  22. private ArticleMapper articleMapper;
  23. @Autowired
  24. private CommentService commentService;
  25.  
  26. @ApiOperation(value="文章查询接口")
  27. @ApiImplicitParam(name = "id", value = "文章ID", required = true, dataType = "Long")
  28. @GetMapping("/{id}")
  29. public String index(Model model, @PathVariable("id") Long id) {
  30. try {
  31. articleService.updateViewsById(id);
  32. } catch (Exception ignore) {
  33. }
  34. List<Setting> settings = settingService.listAll();
  35. Map<String,Object> map = new HashMap<String,Object>();
  36. for (Setting setting : settings) {
  37. map.put(setting.getCode(), setting.getValue());
  38. }
  39. Article article = articleService.getArticleById(id);
  40. model.addAttribute("settings", map);
  41. model.addAttribute("cateList", cateService.listAllCate());
  42. model.addAttribute("article", article);
  43. model.addAttribute("tags", tagReferService.listNameByArticleId(article.getId()));
  44. model.addAttribute("author", userService.getNicknameById(article.getAuthorId()));
  45. //回头改
  46. model.addAttribute("articles", articleMapper.listArticleByTitle(null));
  47. model.addAttribute("similars", articleMapper.listArticleByTitle(null));
  48. CommentQuery query = new CommentQuery();
  49. query.setLimit(10);
  50. query.setPage(1);
  51. query.setArticleId(id);
  52. model.addAttribute("comments", commentService.listCommentByArticleId(query));
  53. return "frontend/article";
  54. }
  55.  
  56. @ApiOperation(value="文章评论查询接口")
  57. @PostMapping("/comments")
  58. @ResponseBody
  59. public DataGridResult comments(CommentQuery query) {
  60. //设置默认10
  61. query.setLimit(10);
  62. return commentService.listCommentByArticleId(query);
  63. }
  64.  
  65. @ApiOperation(value="文章点赞接口")
  66. @ApiImplicitParam(name = "articleId", value = "文章ID", required = true, dataType = "Long")
  67. @PostMapping("/approve")
  68. @ResponseBody
  69. public YYBlogResult approve(@RequestParam Long articleId) {
  70. return articleService.updateApproveCntById(articleId);
  71. }
  72. }

最后同样来个效果图,和上面一样。

 PathSelectors.none()的时候

  1.  
  2. 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自动生成对外接口的文档的更多相关文章

  1. SpringBoot + Swagger2 自动生成API接口文档

    spring-boot作为当前最为流行的Java web开发脚手架,相信越来越多的开发者会使用其来构建企业级的RESTFul API接口.这些接口不但会服务于传统的web端(b/s),也会服务于移动端 ...

  2. 【工具篇】利用DBExportDoc V1.0 For MySQL自动生成数据库表结构文档

    对于DBA或开发来说,如何规范化你的数据库表结构文档是灰常之重要的一件事情.但是当你的库,你的表排山倒海滴多的时候,你就会很头疼了. 推荐一款工具DBExportDoc V1.0 For MySQL( ...

  3. 自动生成并导出word文档

    今天很荣幸又破解一现实难题:自动生成并导出word文档 先看页面效果: word效果: 代码: 先搭建struts2项目 创建action,并在struts.xml完成注册 <?xml vers ...

  4. 基于数据库的自动化生成工具,自动生成JavaBean、数据库文档、框架代码等(v5.8.8版)

    TableGo v5.8.8版震撼发布,此次版本更新如下:          1.新增两个扩展字段,用于生成自定义模板时使用.          2.自定义模板新增模板目录,可以选择不同分类目录下的模 ...

  5. 利用ShowDoc自动生成api接口文档

    最近在做新项目,感觉写完一个接口 还要去再写一遍api文档 挺浪费时间的,所以借用ShowDoc的api开放功能 自动生成api文档. 首先 去 https://www.showdoc.cc/ 注册一 ...

  6. 利用DBExportDoc V1.0 For MySQL自动生成数据库表结构文档

    对于DBA或开发来说,如何规范化你的数据库表结构文档是灰常之重要的一件事情.但是当你的库,你的表排山倒海滴多的时候,你就会很头疼了. 推荐一款工具DBExportDoc V1.0 For MySQL( ...

  7. oracle数据库自动生成数据库表结构文档(亲测有效)

    import java.awt.Color; import java.io.FileOutputStream; import java.sql.Connection; import java.sql. ...

  8. SpringBoot入门教程(二十)Swagger2-自动生成RESTful规范API文档

    Swagger2 方式,一定会让你有不一样的开发体验:功能丰富 :支持多种注解,自动生成接口文档界面,支持在界面测试API接口功能:及时更新 :开发过程中花一点写注释的时间,就可以及时的更新API文档 ...

  9. [Dynamic Language] 用Sphinx自动生成python代码注释文档

    用Sphinx自动生成python代码注释文档 pip install -U sphinx 安装好了之后,对Python代码的文档,一般使用sphinx-apidoc来自动生成:查看帮助mac-abe ...

随机推荐

  1. 开源电子商务平台:OfBiz

    OFBiz是一个电子商务平台,是一个非常著名的开源项目,提供了创建基于最新J2EE/XML规范和技术标准,构建大中型企业级.跨平台.跨数据库.跨应用服务器的多层.分布式电子商务类WEB应用系统的框架. ...

  2. Cocos2d中update与fixedUpdate的区别(六)

    它如何工作呢? update:和fixedUpdate:方法实际这样工作. Cocos2D将从iOS接口中取得时间间隔(delta)在你的游戏代码执行期间,并且检查fixedUpdate:方法在间隔期 ...

  3. GRUB与Linux系统修复(第二版)

    GRUB配置解析 配置文件保存在 /boot/grub/grub.conf[/boot分区最好应该单独划分出来] 软链接保存在 /etc/grub.conf 1.grub.conf文件分析 defau ...

  4. tomcat会话之持久化会话管理器

    前面提到的标准会话管理器已经提供了基础的会话管理功能,但在持久化方面做得还是不够,或者说在某些情景下无法满足要求,例如把会话以文件或数据库形式存储到存储介质中,这些都是标准会话管理器无法做到的,于是另 ...

  5. "《算法导论》之‘线性表’":基于动态分配的数组的顺序表

    我们利用静态分配的数组来实现的顺序表的局限还是挺大的,主要在于它的容量是预先定好的,用户不能根据自己的需要来改变.如果为了后续用户能够自己调整顺序表的大小,动态地分配数组空间还是很有必要的.基于动态分 ...

  6. 四种生成和解析XML文档的方法详解

    众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...

  7. jdk1.7 tomcat-7安装

    由于软件下载地址经常有变动,所以不能直接wget,还是直接到网上点击下载 下载jdk http://www.oracle.com/technetwork/java/javase/downloads/j ...

  8. XML学习教程

    XML学习进阶1-- 什么是XML. 为什么使用 XML?... 什么是 XML?... 数据的结构表示... XML 文档... 数据是从表示和处理中分离出来的... 使XML数据自描述... XM ...

  9. 在线学习Java免费资源推荐

    你想学习Java吗?来对地方了!这篇文章将会介绍很多高质量的免费资源,包括网页.论坛.电子书和速查表. Java是一种面向对象的编程语言,拥有独立.多线程.安全.动态和健壮的特点.归功于其多功能的特点 ...

  10. Linux的vi详解

    Vi简介1. Vi是一种广泛存在于各种UNIX和Linux系统中的文本编辑程序.2. Vi不是排版程序,只是一个纯粹的文本编辑程序.3. Vi是全屏幕文本编辑器,它没有菜单,只有命令.4. Vi不是基 ...