1. 简介

今天是五一的一天,武汉因为疫情不能随意出去,写篇博客打发时间。今天介绍一款非常热门的API开发工具-----Swagger,其遵循OpenAPI规范。使用简单、可以自动化生成API文档、可以模拟HTTP接口请求等强大的功能。它可以节省我们的开发时间,从而提高工作效率。不仅如此,Swagger还支持生成静态文档的功能,可以用来交付一些对文档要求并不是很高的客户。

2. 集成Swagger2

SpringBoot 集成Swagger也非常简单,同样也是简单的三个步骤:导包、配置和使用。

2.1 导入Swagger库

  1. swaggerVersion = '2.6.1'
  2. compile("io.springfox:springfox-swagger2:${swaggerVersion}")
  3. compile("io.springfox:springfox-swagger-ui:${swaggerVersion}")

这两个是swagger自动生成文档需要的库。若需要生成静态文档,还需要导入其他额外的库。

2.2 配置Swagger基本信息

  1. package com.itdragon.server.config
  2. import org.springframework.context.annotation.Bean
  3. import org.springframework.context.annotation.Configuration
  4. import springfox.documentation.builders.ApiInfoBuilder
  5. import springfox.documentation.builders.PathSelectors
  6. import springfox.documentation.builders.RequestHandlerSelectors
  7. import springfox.documentation.service.ApiInfo
  8. import springfox.documentation.service.Contact
  9. import springfox.documentation.spi.DocumentationType
  10. import springfox.documentation.spring.web.plugins.Docket
  11. import springfox.documentation.swagger2.annotations.EnableSwagger2
  12. @EnableSwagger2
  13. @Configuration
  14. class Swagger2Config {
  15. @Bean
  16. fun createRestApi(): Docket {
  17. return Docket(DocumentationType.SWAGGER_2) // 指定生成的文档的类型是Swagger2
  18. .apiInfo(itDragonApiInfo()) // 配置文档页面的基本信息内容
  19. .select()
  20. // 指定扫描包路径
  21. .apis(RequestHandlerSelectors.basePackage("com.itdragon.server.api.rest"))
  22. .paths(PathSelectors.any())
  23. .build()
  24. }
  25. private fun itDragonApiInfo(): ApiInfo {
  26. return ApiInfoBuilder()
  27. .title("ITDragon Swagger API Document")
  28. .description("ITDragon Swagger Description...")
  29. .contact(Contact("ITDragon", "https://www.cnblogs.com/itdragon/", "itdragon@qq.com"))
  30. .version("0.1")
  31. .description("ITDragon SpringBoot Swagger API INFO")
  32. .build()
  33. }
  34. }

1)创建Swagger2的配置类,分别用注解@Configuration和@EnableSwagger2修饰。

2)配置自动生成文档的类型、页面的基本信息和扫描包的路径。

2.3 使用Swagger注解

  1. package com.itdragon.server.api.rest
  2. import io.swagger.annotations.*
  3. import org.springframework.format.annotation.DateTimeFormat
  4. import org.springframework.http.ResponseEntity
  5. import org.springframework.web.bind.annotation.*
  6. import springfox.documentation.annotations.ApiIgnore
  7. import java.util.*
  8. import javax.servlet.http.HttpServletResponse
  9. @Api(tags = ["SwaggerDemo"])
  10. @RestController
  11. @RequestMapping("/itdragon")
  12. class ITDragonSwagger2Controller {
  13. @ApiOperation("方法说明", notes = "通过ApiOperation注解修饰方法,对方法做详细介绍。若不使用,Swagger会以函数名作为描述。", httpMethod = "GET")
  14. @GetMapping("/ApiOperation/info")
  15. fun getITDragonApiOperationInfo(@RequestParam("ids") ids: String): ResponseEntity<Unit> {
  16. return ResponseEntity.ok(Unit)
  17. }
  18. @ApiOperation("参数说明", notes = "通过ApiImplicitParams注解修饰参数,对参数做详细介绍。若不适用,")
  19. @ApiImplicitParams(value = [
  20. ApiImplicitParam(name = "deviceIds", value = "设备ID集合,用逗号区分", required = true, dataType = "String", paramType = "query"),
  21. ApiImplicitParam(name = "search", value = "查询字段")])
  22. @GetMapping("/ApiImplicitParams/info")
  23. fun getITDragonApiImplicitParamsInfo(@RequestParam("deviceIds") deviceIds: String,
  24. @RequestParam("search") search: String,
  25. @ApiIgnore currentUser: String): ResponseEntity<Unit> {
  26. return ResponseEntity.ok(Unit)
  27. }
  28. @ApiOperation("对象参数说明", notes = "")
  29. @PostMapping("/ApiModel/info")
  30. fun postITDragonApiModelInfo(@RequestBody itDragonCreateInfo: ITDragonCreateInfo) {
  31. }
  32. @GetMapping("/Native/info")
  33. fun getITDragonNativeInfo(@RequestParam("active", required = false) active: Boolean?,
  34. @RequestParam("search", required = false) search: String?,
  35. @RequestParam("startTime", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") startTime: Date?,
  36. @RequestParam("endTime", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") endTime: Date?,
  37. @RequestParam("page", required = false, defaultValue = "1") page: Int = 1,
  38. @RequestParam("size", required = false, defaultValue = "10") size: Int = 10): ResponseEntity<Unit> {
  39. return ResponseEntity.ok(Unit)
  40. }
  41. }
  42. @ApiModel("创建用户模型")
  43. class ITDragonCreateInfo {
  44. @ApiModelProperty("用户账号,登录账号")
  45. var username: String? = null
  46. var nikename: String? = null
  47. }

1)使用注解@Api 修饰类,可以描述这个类的作用。实际使用过程中发现:若用中文描述会存在点不开单个接口详情的问题。

2)使用注解@ApiOperation 修饰方法,可以描述这个方法的功能和注意事项。若不使用则用函数名作为方法功能。

3)使用注解@ApiImplicitParams 修饰方法,可以描述这个方法的参数的作用。若不使用则用参数名作为参数的作用。

4)使用注解@ApiModel 修饰实体类,可以描述这个类的功能。

5)使用注解@ApiModelProperty 修饰实体类的属性,可以描述这个属性的作用。

6)使用注解@ApiIgnore 修饰参数、方法和类,可以在自动生成文档时对修饰的对象进行忽略。

小结:我ITDragon一般在需要有中文描述的场景下会使用这些注解。因为swagger很强大,即便是不使用注解,依然可以自动生成文档。

2.4 文档效果图

3. 常用注解介绍

注解 说明
ApiOperation 描述一个方法的作用和相关的提示信息
ApiImplicitParams 描述一个方法的多个参数的作用、数据类型、等信息
ApiIgnore 生成的文档忽略被修饰的类、方法、参数
ApiModel 描述一个实体类的功能
ApiModelProperty 描述一个实体类属性的作用

还有很多像@Api、@ApiParam、@ApiProperty这些注解,我ITDragon 觉得意义不是特别大。把更多的精力放在业务逻辑上。因为Swagger生成的文档更适合团队内部使用,内部人对文档的要求并不是特别高。但是对于一些严格的客户,文档还是要重新写。

4. Swagger2文档导出成pdf

4.1 生成pdf的格式

ITDragon 曾经按照网上的教程将swagger文档生成markdown格式的静态文档,然后再通过Typora工具导出成pdf。虽然也支持导出成word文档。但是word文档的排版不好看。而且静态文档的最大缺陷就是实体类和接口是分开的。效果图如下所示。

接口定义的部分:

实体类声明的部分:

当然你也可以把实体类的数据拷贝到接口对应的位置。但是这个工作量也不小。

4.2 生成静态文档步骤

4.2.1 配置gradle

完整代码可以点击文章底部的链接地址

  1. buildscript {
  2. ext {
  3. springBootVersion = '2.0.6.RELEASE'
  4. swaggerVersion = '2.6.1'
  5. }
  6. dependencies {
  7. classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
  8. classpath("com.benjaminsproule:swagger-gradle-plugin:1.0.7")
  9. }
  10. }
  11. apply plugin: 'com.benjaminsproule.swagger'
  12. swagger {
  13. apiSource {
  14. springmvc = true
  15. locations = ["com.itdragon.server.api.rest"]
  16. schemes = ["http", "https"]
  17. host = "www.cnblogs.com/itdragon"
  18. info {
  19. title = "ITDragon Swagger2 API Document"
  20. version = "0.1"
  21. description = "API Document Description"
  22. contact {
  23. email = "itdragon@qq.com"
  24. name = "ITDragon"
  25. url = "https://www.cnblogs.com/itdragon/"
  26. }
  27. license {
  28. url = "http://www.apache.org/licenses/LICENSE-2.0.html"
  29. name = "Apache 2.0"
  30. }
  31. }
  32. outputPath = "${project.rootDir}/generated/document.html"
  33. swaggerDirectory = "${project.rootDir}/generated/swagger-ui"
  34. attachSwaggerArtifact = true
  35. }
  36. }
  37. dependencies {
  38. /* swagger */
  39. compile("io.swagger:swagger-annotations:1.5.21")
  40. compile("io.springfox:springfox-swagger2:${swaggerVersion}")
  41. compile("io.springfox:springfox-swagger-ui:${swaggerVersion}")
  42. compile("io.springfox:springfox-staticdocs:${swaggerVersion}")
  43. testCompile('org.springframework.restdocs:spring-restdocs-mockmvc:2.0.2.RELEASE')
  44. }

4.2.2 生成swagger json文件

在项目根目录下,运行./gradlew generateSwaggerDocumentation 命令。

若成功,会在根目录下生成:/generated/swagger-ui/swagger.json,且这个json文件内容不为空。反之则失败。

  1. admin@DESKTOP-3 MINGW64 /d/daydayup/SpringBoot/spring-boot-swagger2 (master)
  2. $ ./gradlew generateSwaggerDocumentation
  3. > Task :compileKotlin UP-TO-DATE
  4. > Task :compileJava NO-SOURCE
  5. > Task :processResources UP-TO-DATE
  6. > Task :classes UP-TO-DATE
  7. > Task :generateSwaggerDocumentation
  8. BUILD SUCCESSFUL in 5s
  9. 3 actionable tasks: 1 executed, 2 up-to-date

注意:

1)若ApiImplicitParam 若没有dataType或者paramType,则会导致生成静态文档报错> Unrecognized Type: [null]

4.2.3 生成swagger markdown文件

在src目录下创建\test\kotlin\com\itdragon\server\ITDragonGenerateDoc.kt 文件,代码内容如下:

  1. package com.itdragon.server
  2. import io.github.robwin.markup.builder.MarkupLanguage
  3. import io.github.robwin.swagger2markup.Swagger2MarkupConverter
  4. import org.junit.Test
  5. class ITDragonGenerateDoc {
  6. private val snippetDir = "/generated/snippets"
  7. private val outputDir = "generated/swagger-ui"
  8. /**
  9. * 第一步:./gradlew generateSwaggerDocumentation
  10. * 第二步:./gradlew test --tests *ITDragonGenerateDoc
  11. */
  12. @Test
  13. @Throws(Exception::class)
  14. fun doIt() {
  15. Swagger2MarkupConverter.from("$outputDir/swagger.json")
  16. .withMarkupLanguage(MarkupLanguage.MARKDOWN)
  17. .withExamples(snippetDir)
  18. .build()
  19. .intoFolder(outputDir)
  20. }
  21. }

同时在项目根目录下运行./gradlew test --tests *ITDragonGenerateDoc 命令。

运行成功后会在/generated/swagger-ui/目录下生成三个文件,分别是:overview.md、definitions.md、paths.md文件。

注意:

1)若指定 .withPathsGroupedBy(GroupBy.TAGS) 按照按tag排序,但是有的注解并没有指定tag会报错。

4.2.4 markdown转pdf

我们可以使用Typora工具,将markdown格式的文件导出成pdf或者word文件。

源码地址:https://github.com/ITDragonBlog/daydayup

SpringBoot 集成Swagger2自动生成文档和导出成静态文件的更多相关文章

  1. golang gin框架 集成swagger 自动生成文档

    goswagger github仓库 https://github.com/swaggo/swag 安装 swag cli 1.因为网络原因,先安装gopm 管理工具 go get -v -u git ...

  2. Springboot集成swagger2生成接口文档

    [转载请注明]: 原文出处:https://www.cnblogs.com/jstarseven/p/11509884.html    作者:jstarseven    码字挺辛苦的.....   一 ...

  3. 使用 Swagger 自动生成 ASP.NET Core Web API 的文档、在线帮助测试文档(ASP.NET Core Web API 自动生成文档)

    对于开发人员来说,构建一个消费应用程序时去了解各种各样的 API 是一个巨大的挑战.在你的 Web API 项目中使用 Swagger 的 .NET Core 封装 Swashbuckle 可以帮助你 ...

  4. MVC WEB api 自动生成文档

    最近在一直在用webapi做接口给移动端用.但是让我纠结的时候每次新加接口或者改动接口的时候,就需要重新修改文档这让我很是苦恼.无意中发现.webapi居然有自动生成文档的功能....真是看见了救星啊 ...

  5. eoLinker 新功能发布,增加了识别代码注释自动生成文档功能

    产品地址:https://www.eolinker.com开源代码:https://www.eolinker.com/#/os/download在线生成代码注释工具:http://tool.eolin ...

  6. 使用swagger在netcorewebapi项目中自动生成文档

    一.背景 随着前后端分离模式大行其道,我们需要将后端接口撰写成文档提供给前端,前端可以查看我们的接口,并测试,提高我们的开发效率,减少无效的沟通.在此情况下,通过代码自动生成文档,这种需求应运而生,s ...

  7. 【Sphinx】 为Python自动生成文档

    sphinx 前言 Sphinx是一个可以用于Python的自动文档生成工具,可以自动的把docstring转换为文档,并支持多种输出格式包括html,latex,pdf等 开始 建一个存放文档的do ...

  8. 使用doctest代码测试和Sphinx自动生成文档

    python代码测试并自动生成文档 Tips:两大工具:doctest--单元测试.Sphinx--自动生成文档 1.doctest doctest是python自带的一个模块.doctest有两种使 ...

  9. 用doxygen自动生成文档

    1. 添加符合doxygen解析规则的注释 (比如函数说明,函数参数/返回值说明) 用qt-creator可以在函数上方一行键入“/**”,然后直接回车,就可以自动生成默认的格式. 2. 安装doxy ...

随机推荐

  1. CF633(div.2)C. Powered Addition

    题目描述 http://codeforces.com/contest/1339/problem/C 给定一个长度为 \(n\) 的无序数组,你可以在第 \(x\) 秒进行一次下面的操作. 从数组选取任 ...

  2. MTK Android 平台语言支持状态

    Language English Name Chinese Name Code GB ICS  JB  KK L العربية Arabic(Israel) 阿拉伯语(以色列) ar_IL Y Y ...

  3. MySQL学习之路6-数据表连接方式

    内连接 关键字: inner join  on 语句:select * from <a_table> inner join <b_table> on a.id = b.id ; ...

  4. Alibaba Cloud Linux 2 LTS 正式发布,提供更高性能和更多保障!

    在Alibaba Cloud Linux 2(原Aliyun Linux 2)上线一年之际阿里云对外正式发布Alibaba Cloud Linux 2 LTS版本.LTS版本的发布对于Alibaba ...

  5. 响应式web设计(Responsive web design)

    在全面进入互联网时代后,随着各种移动设备的普及,移动互联网更加受到大众的青睐.由于移动互联网的使用量远远超出了传统互联网的使用量,移动设备也正在逐渐超越桌面设备.因为用户在移动设备上的使用习惯不同,U ...

  6. centos7安装puppet详细教程(简单易懂,小白也可以看懂的教程)

    简介: Puppet是一种linux.unix平台的集中配置管理系统,使用ruby语言,可配置文件.用户.cron任务.软件包.系统服务等.Puppet把这些系统实体称之为资源,它的设计目标是简化对这 ...

  7. 从谷歌面试翻车到offer收割的心路历程

    首先声明,这只是我的播客随感,其中无法避免有一些个人色彩的见解,请不要在意,我尊敬任何的互联网公司,尊敬研究生期间的老师同学,我只希望给在求学路上的CS同学一些启发. 先介绍一下背景,我是ACM铜牌退 ...

  8. VulnHub靶场学习_HA: Avengers Arsenal

    HA: Avengers Arsenal Vulnhub靶场 下载地址:https://www.vulnhub.com/entry/ha-avengers-arsenal,369/ 背景: 复仇者联盟 ...

  9. AJ学IOS(47)之网易彩票帮助界面UIWebView的运用

    AJ分享,必须精品 效果: 制作过程 首先是帮助按钮那个地方的点击. 这里是用点击跳转的用的是 NJSettingArrowItem,前面的设置的,从字典通过模型转过来的. // 分享 NJSetti ...

  10. 【Java】标识符 & 命名规则

    Java的标识符和命名规则 什么是标识符[Identifier]? 指用来标识某个实体的一个符号.在不同的应用环境下有不同的含义. 在编程语言中,标识符是开发者编程时使用的名字,对于变量.常量.函数. ...