swagger2 导出api为html和word文档

参考地址

https://blog.csdn.net/zhuyu19911016520/article/details/85048271

依赖引入

<dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.8.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.8.0</version>
        </dependency>

        <!-- ********************* swagger导出PDF/HTML所需依赖 START ********************************* -->
        <dependency>
            <groupId>io.github.swagger2markup</groupId>
            <artifactId>swagger2markup</artifactId>
            <version>1.3.1</version>
        </dependency>

第二部分需要添加的是生成ASCIIDOC所需要maven插件:

<!--此插件生成ASCIIDOC-->
            <plugin>
                <groupId>io.github.swagger2markup</groupId>
                <artifactId>swagger2markup-maven-plugin</artifactId>
                <version>1.2.0</version>
                <configuration>
                    <!--此处端口一定要是当前项目启动所用的端口-->
                    <swaggerInput>http://localhost:8082/v2/api-docs</swaggerInput>
                    <outputDir>src/docs/asciidoc/generated</outputDir>
                    <config>
                        <!-- 除了ASCIIDOC之外,还有MARKDOWN和CONFLUENCE_MARKUP可选 -->
                        <swagger2markup.markupLanguage>ASCIIDOC</swagger2markup.markupLanguage>
                    </config>
                </configuration>
            </plugin>

第三部分需要添加输出PDF和HTML的maven插件:

<!--此插件生成HTML和PDF-->
            <plugin>
                <groupId>org.asciidoctor</groupId>
                <artifactId>asciidoctor-maven-plugin</artifactId>
                <version>1.5.3</version>
                <!-- Include Asciidoctor PDF for pdf generation -->
                <dependencies>
                    <dependency>
                        <groupId>org.asciidoctor</groupId>
                        <artifactId>asciidoctorj-pdf</artifactId>
                        <version>1.5.0-alpha.10.1</version>
                    </dependency>
                    <dependency>
                        <groupId>org.jruby</groupId>
                        <artifactId>jruby-complete</artifactId>
                        <version>1.7.21</version>
                    </dependency>
                </dependencies>
                <!-- Configure generic document generation settings -->
                <configuration>
                    <sourceDirectory>src/docs/asciidoc/generated</sourceDirectory>
                    <sourceHighlighter>coderay</sourceHighlighter>
                    <attributes>
                        <toc>left</toc>
                    </attributes>
                </configuration>
                <!-- Since each execution can only handle one backend, run
                     separate executions for each desired output type -->
                <executions>
                    <execution>
                        <id>output-html</id>
                        <phase>generate-resources</phase>
                        <goals>
                            <goal>process-asciidoc</goal>
                        </goals>
                        <configuration>
                            <backend>html5</backend>
                            <outputDirectory>src/docs/asciidoc/html</outputDirectory>
                        </configuration>
                    </execution>

                    <execution>
                        <id>output-pdf</id>
                        <phase>generate-resources</phase>
                        <goals>
                            <goal>process-asciidoc</goal>
                        </goals>
                        <configuration>
                            <backend>pdf</backend>
                            <outputDirectory>src/docs/asciidoc/pdf</outputDirectory>
                        </configuration>
                    </execution>

                </executions>
            </plugin>

最后执行命令

1.mvn swagger2markup:convertSwagger2markup

2.mvn generate-resources

 

 

方式2:

相信很多后端开发在项目中都会碰到要写 api 文档,不管是给前端、移动端等提供更好的对接,还是以后为了以后交接方便,都会要求写 api 文档。可参考:https://www.zwqh.top/article/info/24

而手写 api 文档的话有诸多痛点:

  • 文档更新的时候,需要再次发送给对接人
  • 接口太对,手写文档很难管理
  • 接口返回的结果不明确
  • 不能直接在线测试接口,通常需要使用工具,如 postman 等

Swagger 就很好的解决了这个问题。

Swagger 简介

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。

官网:https://swagger.io

Swagger 使用

1.相关依赖

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

2.Swagger 配置类

 
  1. @Configuration
  2. @EnableSwagger2
  3. public class SwaggerConfig {
  4. @Bean
  5. public Docket buildDocket() {
  6. return new Docket(DocumentationType.SWAGGER_2)
  7. .apiInfo(buildApiInf()) //将api的元信息设置为包含在json resourcelisting响应中
  8. //.host("127.0.0.1:8080") //设置ip和端口,或者域名
  9. .select() //启动用于api选择的生成器
  10. //.apis(RequestHandlerSelectors.any())
  11. .apis(RequestHandlerSelectors.basePackage("cn.zwqh.springboot.controller"))//指定controller路径
  12. .paths(PathSelectors.any()).build();
  13. }
  14.  
  15. private ApiInfo buildApiInf() {
  16.  
  17. Contact contact=new Contact("朝雾轻寒","https://www.zwqh.top/","zwqh@clover1314.com");
  18. return new ApiInfoBuilder()
  19. .title("Swagger Demo Restful API Docs")//文档标题
  20. .description("Swagger 示例 Restful Api 文档")//文档描述
  21. .contact(contact)//联系人
  22. .version("1.0")//版本号
  23. //.license("")//更新此API的许可证信息
  24. //.licenseUrl("")//更新此API的许可证Url
  25. //.termsOfServiceUrl("")//更新服务条款URL
  26. .build();
  27.  
  28. }
  29. }

3.Spring MVC 相关配置

 
  1. @Configuration
  2. public class WebMvcConfig extends WebMvcConfigurationSupport {
  3. /**
  4. * 静态资源配置(默认)
  5. */
  6. @Override
  7. public void addResourceHandlers(ResourceHandlerRegistry registry) {
  8. registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");// 静态资源路径
  9. registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
  10. registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
  11. super.addResourceHandlers(registry);
  12. }
  13.  
  14.  
  15. }

如果不添加此静态资源配置会报错,找不到相关路径

4.Model 中使用 Swagger 注解

 
  1. @ApiModel(value = "UserEntity", description = "用户对象")
  2. public class UserEntity implements Serializable{
  3.  
  4. /**
  5. *
  6. */
  7. private static final long serialVersionUID = 5237730257103305078L;
  8. @ApiModelProperty(value ="用户id",name="id",dataType="Long",required = false,example = "1",hidden = false )
  9. private Long id;
  10. @ApiModelProperty(value ="用户名",name="userName",dataType="String",required = false,example = "关羽" )
  11. private String userName;
  12. @ApiModelProperty(value ="用户性别",name="userSex",dataType="String",required = false,example = "男" )
  13. private String userSex;
  14.  
  15. public Long getId() {
  16. return id;
  17. }
  18.  
  19. public void setId(Long id) {
  20. this.id = id;
  21. }
  22.  
  23. public String getUserName() {
  24. return userName;
  25. }
  26.  
  27. public void setUserName(String userName) {
  28. this.userName = userName;
  29. }
  30.  
  31. public String getUserSex() {
  32. return userSex;
  33. }
  34.  
  35. public void setUserSex(String userSex) {
  36. this.userSex = userSex;
  37. }
  38.  
  39. }

5. Controller 中使用 Swagger 注解

 
  1.  
  2. @RestController
  3. @RequestMapping("/api")
  4. @Api(tags = { "接口分组1", "接口分组2" })
  5. public class ApiController {
  6.  
  7. @Autowired
  8. private UserDao userDao;
  9.  
  10. @GetMapping("/getAllUser")
  11. @ApiOperation(value = "获取所有用户", notes = "", httpMethod = "GET", tags = "接口分组3")
  12. public List<UserEntity> getAll() {
  13. return userDao.getAll();
  14. }
  15.  
  16. @GetMapping("/getUserById")
  17. @ApiOperation(value = "根据id获取用户", notes = "id必传", httpMethod = "GET")
  18. @ApiImplicitParam(name = "id", value = "用户id",example = "1", required = true, dataType = "long", paramType = "query")
  19. public UserEntity getOne(Long id) {
  20. return userDao.getOne(id);
  21. }
  22.  
  23. @PostMapping("/getUserByNameAndSex")
  24. @ApiOperation(value = "根据name和sex获取用户", notes = "", httpMethod = "POST")
  25. @ApiImplicitParams({
  26. @ApiImplicitParam(name = "userName", value = "用户名", example = "关羽", required = true, dataType = "string", paramType = "query"),
  27. @ApiImplicitParam(name = "userSex", value = "用户性别", example = "男", required = true, dataType = "string", paramType = "query") })
  28. public UserEntity getUserByNameAndSex(String userName, String userSex) {
  29. return userDao.getUserByNameAndSex(userName, userSex);
  30. }
  31.  
  32. @PostMapping("/insertUser")
  33. @ApiOperation(value = "新增用户", notes = "传json,数据放body", httpMethod = "POST")
  34. @ApiImplicitParams({
  35. @ApiImplicitParam(name = "body", value = "用户对象json", example = "{userName:'朝雾轻寒',userSex:'男'}", required = true) })
  36. public String insertUser(@RequestBody String body) {
  37. System.out.println(body);
  38. UserEntity user = JSON.parseObject(body, UserEntity.class);
  39. userDao.insertUser(user);
  40. return "{code:0,msg:'success'}";
  41. }
  42.  
  43. @PostMapping("/updateUser")
  44. @ApiOperation(value = "修改用户", notes = "传json,数据放body", httpMethod = "POST")
  45. @ApiImplicitParams({
  46. @ApiImplicitParam(name = "body", value = "用户对象json", example = "{id:23,userName:'朝雾轻寒',userSex:'女'}", required = true) })
  47. public String updateUser(@RequestBody String body) {
  48. System.out.println(body);
  49. UserEntity user = JSON.parseObject(body, UserEntity.class);
  50. userDao.updateUser(user);
  51. return "{code:0,msg:'success'}";
  52. }
  53.  
  54. @PostMapping("/deleteUser")
  55. @ApiOperation(value = "删除用户", notes = "id必传", httpMethod = "POST")
  56. public String deleteUser(@ApiParam(name = "id", value = "用户id", required = true) Long id) {
  57. userDao.deleteUser(id);
  58. return "{code:0,msg:'success'}";
  59. }
  60. }

5.测试

访问 http://127.0.0.1:8080/swagger-ui.html 进行接口在线测试

Swagger 常用注解

1.@Api

用于类,表示标识这个类是swagger的资源。属性如下:

  • tags 表示说明,tags如果有多个值,会生成多个列表
  • value 表示说明,可以使用tags替代

2.@ApiOperation

用于方法,表示一个http请求的操作。属性如下:

  • value 用于方法描述
  • notes 用于提示内容
  • tags 用于API文档控制的标记列表,视情况而用,可以进行独立分组

3.@ApiParam

用于方法、参数、字段说明;表示对参数的添加元数据。

  • name 参数名
  • value 参数说明
  • required 是否必填

4.@ApiModel

用于类,表示对类进行说明,用于参数用实体类接受。

  • value 对象名
  • description 描述

5.@ApiModelProperty

用于方法、字段,表示对model属性的说明或者数据操作更改。

  • value 字段说明
  • name 重写属性名
  • dataType 重写属性数据类型
  • required 是否必填
  • example 举例说明
  • hidden 隐藏

6.@ApiIgnore

用于类、方法、方法参数,表示这个方法或者类被忽略,不在swagger-ui.html上显示。

7.@ApiImplicitParam

用于方法,表示单独的请求参数。

  • name 参数名
  • value 参数说明
  • dataType 数据类型
  • paramType 参数类型
  • example 举例说明

8.@ApiImplicitParams

用于方法,包含多个 @ApiImplicitParam

9.@ApiResponses @ApiResponse

用于类或者方法,描述操作的可能响应。

  • code 响应的HTTP状态代码
  • message 响应附带的可读消息

10.@ResponseHeader

用于方法,响应头设置。

  • name 响应头名称
  • description 头描述
  • response 默认响应类 void
  • responseContainer 参考ApiOperation中配置

Swagger 导出离线 api 文档

1.导出 AsciiDocs、Markdown、Confluence 格式文档

添加依赖

 
  1. <!-- swagger2markup 相关依赖 -->
  2. <dependency>
  3. <groupId>io.github.swagger2markup</groupId>
  4. <artifactId>swagger2markup</artifactId>
  5. <version>1.3.3</version>
  6. </dependency>

转换工具类

 
  1. public class SwaggerUtils {
  2.  
  3. private static final String url = "http://127.0.0.1:8080/v2/api-docs";
  4. /**
  5. * 生成AsciiDocs格式文档
  6. * @throws MalformedURLException
  7. */
  8. public static void generateAsciiDocs() throws MalformedURLException {
  9. Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder()
  10. .withMarkupLanguage(MarkupLanguage.ASCIIDOC)
  11. .withOutputLanguage(Language.ZH)
  12. .withPathsGroupedBy(GroupBy.TAGS)
  13. .withGeneratedExamples()
  14. .withoutInlineSchema().build();
  15.  
  16. Swagger2MarkupConverter.from(new URL(url))
  17. .withConfig(config)
  18. .build()
  19. .toFolder(Paths.get("./docs/asciidoc/generated"));
  20. }
  21. /**
  22. * 生成AsciiDocs格式文档,并汇总成一个文件
  23. * @throws MalformedURLException
  24. */
  25. public static void generateAsciiDocsToFile() throws MalformedURLException {
  26. Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder()
  27. .withMarkupLanguage(MarkupLanguage.ASCIIDOC)
  28. .withOutputLanguage(Language.ZH)
  29. .withPathsGroupedBy(GroupBy.TAGS)
  30. .withGeneratedExamples()
  31. .withoutInlineSchema()
  32. .build();
  33.  
  34. Swagger2MarkupConverter.from(new URL(url))
  35. .withConfig(config)
  36. .build()
  37. .toFile(Paths.get("./docs/asciidoc/generated/all"));
  38. }
  39.  
  40. /**
  41. * 生成Markdown格式文档
  42. * @throws MalformedURLException
  43. */
  44. public static void generateMarkdownDocs() throws MalformedURLException {
  45. Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder()
  46. .withMarkupLanguage(MarkupLanguage.MARKDOWN)
  47. .withOutputLanguage(Language.ZH)
  48. .withPathsGroupedBy(GroupBy.TAGS)
  49. .withGeneratedExamples()
  50. .withoutInlineSchema()
  51. .build();
  52.  
  53. Swagger2MarkupConverter.from(new URL(url))
  54. .withConfig(config)
  55. .build()
  56. .toFolder(Paths.get("./docs/markdown/generated"));
  57. }
  58. /**
  59. * 生成Markdown格式文档,并汇总成一个文件
  60. * @throws MalformedURLException
  61. */
  62. public static void generateMarkdownDocsToFile() throws MalformedURLException {
  63. Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder()
  64. .withMarkupLanguage(MarkupLanguage.MARKDOWN)
  65. .withOutputLanguage(Language.ZH)
  66. .withPathsGroupedBy(GroupBy.TAGS)
  67. .withGeneratedExamples()
  68. .withoutInlineSchema()
  69. .build();
  70.  
  71. Swagger2MarkupConverter.from(new URL(url))
  72. .withConfig(config)
  73. .build()
  74. .toFile(Paths.get("./docs/markdown/generated/all"));
  75. }
  76.  
  77. /**
  78. * 生成Confluence格式文档
  79. * @throws MalformedURLException
  80. */
  81. public static void generateConfluenceDocs() throws MalformedURLException {
  82. Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder()
  83. .withMarkupLanguage(MarkupLanguage.CONFLUENCE_MARKUP)
  84. .withOutputLanguage(Language.ZH)
  85. .withPathsGroupedBy(GroupBy.TAGS)
  86. .withGeneratedExamples()
  87. .withoutInlineSchema()
  88. .build();
  89.  
  90. Swagger2MarkupConverter.from(new URL(url))
  91. .withConfig(config)
  92. .build()
  93. .toFolder(Paths.get("./docs/confluence/generated"));
  94. }
  95.  
  96. /**
  97. * 生成Confluence格式文档,并汇总成一个文件
  98. * @throws MalformedURLException
  99. */
  100. public static void generateConfluenceDocsToFile() throws MalformedURLException {
  101. Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder()
  102. .withMarkupLanguage(MarkupLanguage.CONFLUENCE_MARKUP)
  103. .withOutputLanguage(Language.ZH)
  104. .withPathsGroupedBy(GroupBy.TAGS)
  105. .withGeneratedExamples()
  106. .withoutInlineSchema()
  107. .build();
  108.  
  109. Swagger2MarkupConverter.from(new URL(url))
  110. .withConfig(config)
  111. .build()
  112. .toFile(Paths.get("./docs/confluence/generated/all"));
  113. }
  114.  
  115.  
  116. }

使用测试 Controller

 
  1. @RestController
  2. @RequestMapping("/export")
  3. @ApiIgnore
  4. public class ExportController {
  5.  
  6.  
  7. @RequestMapping("/ascii")
  8. public String exportAscii() throws MalformedURLException{
  9. SwaggerUtils.generateAsciiDocs();
  10. return "success";
  11. }
  12.  
  13. @RequestMapping("/asciiToFile")
  14. public String asciiToFile() throws MalformedURLException{
  15. SwaggerUtils.generateAsciiDocsToFile();
  16. return "success";
  17. }
  18.  
  19. @RequestMapping("/markdown")
  20. public String exportMarkdown() throws MalformedURLException{
  21. SwaggerUtils.generateMarkdownDocs();
  22. return "success";
  23. }
  24.  
  25. @RequestMapping("/markdownToFile")
  26. public String exportMarkdownToFile() throws MalformedURLException{
  27. SwaggerUtils.generateMarkdownDocsToFile();
  28. return "success";
  29. }
  30.  
  31. @RequestMapping("/confluence")
  32. public String confluence() throws MalformedURLException{
  33. SwaggerUtils.generateConfluenceDocs();
  34. return "success";
  35. }
  36.  
  37. @RequestMapping("/confluenceToFile")
  38. public String confluenceToFile() throws MalformedURLException{
  39. SwaggerUtils.generateConfluenceDocsToFile();
  40. return "success";
  41. }
  42. }

2.导出 html、pdf、xml 格式

添加依赖

 
  1. <!--离线文档 -->
  2. <dependency>
  3. <groupId>org.springframework.restdocs</groupId>
  4. <artifactId>spring-restdocs-mockmvc</artifactId>
  5. <scope>test</scope>
  6. </dependency>
  7. <!--springfox-staticdocs 生成静态文档 -->
  8. <dependency>
  9. <groupId>io.springfox</groupId>
  10. <artifactId>springfox-staticdocs</artifactId>
  11. <version>2.6.1</version>
  12. </dependency>
 
  1. <build>
  2. <pluginManagement>
  3. <plugins>
  4. <plugin>
  5. <groupId>org.springframework.boot</groupId>
  6. <artifactId>spring-boot-maven-plugin</artifactId>
  7. </plugin>
  8. <plugin>
  9. <groupId>io.github.swagger2markup</groupId>
  10. <artifactId>swagger2markup-maven-plugin</artifactId>
  11. <version>1.3.1</version>
  12. <configuration>
  13. <swaggerInput>http://127.0.0.1:8080/v2/api-docs</swaggerInput>
  14. <outputDir>./docs/asciidoc/generated</outputDir>
  15. <config>
  16. <swagger2markup.markupLanguage>ASCIIDOC</swagger2markup.markupLanguage>
  17. </config>
  18. </configuration>
  19. </plugin>
  20. <plugin>
  21. <groupId>org.asciidoctor</groupId>
  22. <artifactId>asciidoctor-maven-plugin</artifactId>
  23. <version>1.5.3</version>
  24. <!-- <version>2.0.0-RC.1</version> -->
  25. <!-- Include Asciidoctor PDF for pdf generation -->
  26. <dependencies>
  27. <dependency>
  28. <groupId>org.asciidoctor</groupId>
  29. <artifactId>asciidoctorj-pdf</artifactId>
  30. <version>1.5.0-alpha.10.1</version>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.jruby</groupId>
  34. <artifactId>jruby-complete</artifactId>
  35. <version>1.7.21</version>
  36. </dependency>
  37. </dependencies>
  38. <configuration>
  39. <sourceDirectory>./docs/asciidoc/generated</sourceDirectory>
  40. <outputDirectory>./docs/asciidoc/html</outputDirectory>
  41. <backend>html</backend>
  42. <!-- <outputDirectory>./docs/asciidoc/pdf</outputDirectory>
  43. <backend>pdf</backend> -->
  44. <headerFooter>true</headerFooter>
  45. <doctype>book</doctype>
  46. <sourceHighlighter>coderay</sourceHighlighter>
  47. <attributes>
  48. <!-- 菜单栏在左边 -->
  49. <toc>left</toc>
  50. <!-- 多标题排列 -->
  51. <toclevels>3</toclevels>
  52. <!-- 自动打数字序号 -->
  53. <sectnums>true</sectnums>
  54. </attributes>
  55. </configuration>
  56. </plugin>
  57. </plugins>
  58. </pluginManagement>
  59.  
  60. </build>

可以修改此处 html 和 pdf,通过 mvn asciidoctor:process-asciidoc 可以导出相应格式文件

 
  1. <outputDirectory>./docs/asciidoc/html</outputDirectory>
  2. <backend>html</backend>

执行 mvn asciidoctor:process-asciidoc 后再执行 mvn generate-resources,可在 targt/generated-docs 目录下生成 xml 格式文件。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值