目的与背景:

目的:对外暴露DBA Service必要的RESTful API,形成规整的API文档

背景:DBA Service后端采用Spring-boot,属于Spring家族,故生成API的工具采用基于Swagger2实现的SpringFox-Swagger2

一、API在线生成配置

1、通过Maven引入springfox-swagger2 springfox-swagger-ui两个依赖,如下:

  1. <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>

2、创建Swagger2配置类

(1)在和WatchmanApplication启动类平行的路经下创建Swagger.java (类名自定)

(2)类内容如下:

  1. @Configuration
    @EnableSwagger2
    public class Swagger2 {
    @Value("${swagger.enable}")
    private boolean isEnableSwagger;
  2.  
  3. @Bean
     public Docket createRestApi() {
     return new Docket(DocumentationType.SWAGGER_2)
    .apiInfo(apiInfo())
    .enable(isEnableSwagger)
    .select()
     .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
    .build();
    }
  4.  
  5. private ApiInfo apiInfo() {
    return new ApiInfoBuilder()
    .title("DBA Service 对外 API")
    .description("DBA Service 对外提供的标准 RESTful API")
    .termsOfServiceUrl("http://172.16.202.151:8888")
    .contact("Yang Ren")
    .version("1.0")
    .build();
    }
  6.  
  7. private Predicate<String> petstorePaths() {
    return or(
    regex("/api/inceptor.*")
    );
    }
    }

其中,@Configuration@EnableSwagger2两个注解是装配和启用Swagger2的标志;

apiInfo()函数定义配置信息;createRestApi()返回API。

3、在Controller处配置要对外暴露的API注解

注解说明(具体百度,同时参考代码中的使用):

  1. 实体类:@ApiModel@ApiModelProperty用于在通过对象接收参数时在API文档中显示字段的说明

控制类:@Api、@ApiOperation 、@ApiImplicitParams&@ApiImplicitParam 、@ApiResponses&@ApiResponse 、@ApiIgnore

4、WebUI形式访问

此时将项目正常启动,通过 http://localhost:8888/swagger-ui.html 来访问,localhost换成DBA Service所在的主机IP

二、生成离线html和pdf的静态API文档

需要借助Swagger2Markup开源工具生成AsciiDoc,AsciiDoc再被解析执行生成静态html和pdf。

5、Maven引入相关依赖,分两部分

(1)引入Swagger2Markup相关的依赖

...

  1. <dependency>
    <groupId>io.github.swagger2markup</groupId>
    <artifactId>swagger2markup</artifactId>
    <version>1.3.1</version>
    </dependency>
    ...
  1. <repositories>
    <repository>
    <snapshots>
    <enabled>false</enabled>
    </snapshots>
    <id>jcenter-releases</id>
    <name>jcenter</name>
    <url>http://jcenter.bintray.com</url>
    </repository>
    </repositories>

(2)引入解析AsciiDoc来生成HTML和PDF的插件依赖

下面是结合各方自己调配的,生成HTML和PDF的通过<execution>标签使其独立各自执行一次,最终分别生成静态HTML和PDF文档。(其中一定要注意路经配置)

  1. <plugin>
    <groupId>org.asciidoctor</groupId>
    <artifactId>asciidoctor-maven-plugin</artifactId>
    <version>1.5.6</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/main/resources/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/main/resources/docs/asciidoc/html</outputDirectory>
    </configuration>
    </execution>
  2.  
  3. <execution>
    <id>output-pdf</id>
    <phase>generate-resources</phase>
    <goals>
    <goal>process-asciidoc</goal>
    </goals>
    <configuration>
    <backend>pdf</backend>
    <outputDirectory>src/main/resources/docs/asciidoc/pdf</outputDirectory>
    </configuration>
    </execution>
  4.  
  5. </executions>
    </plugin>

6、编写一个单元测试(我的单元测试类命名为Swagger2Test),目的是用来生成执行生成文档的代码,我的定义如下:

  1. @RunWith(SpringRunner.class)
    @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
    public class Swagger2Test {
    @Test
     public void generateAsciiDocs() throws Exception {
    // 输出Ascii格式
     Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder()
    .withMarkupLanguage(MarkupLanguage.ASCIIDOC)
    .build();
    Swagger2MarkupConverter.from(new URL("http://localhost:8888/v2/api-docs"))
    .withConfig(config)
    .build()
    .toFile(Paths.get("src/main/resources/docs/asciidoc/generated/all"));
  2.  
  3. }
    }

本项目需求是生成一个完整的html和pdf,使用的是toFile()函数。其中必须要指定两项内容(绿色部分),前者是API的Json访问URL路经;后者是生成的执行生成文档的代码所保存到的路经。

备注:这里遇到一个坑,即Swagger2Markup依赖的common-beanutils和其他依赖这个包产生了冲突,我显示的把common-beanutils1.9.4放到了前边高优先级的位置,也就是之后不管哪个依赖的commons-beanutils都是1.9.4

7、运行单元测试(Swagger2Test)

注意:运行前一定要关闭IDE里启动的DBA Service,否则启动单元测试就拿不到Application Context,一定是冲突了。

正确执行完单元测试,可以看到/src/main/resources/docs/asciidoc/generated路经(这个路经就是单元测试中配置的那个路经)下多出了一个all.adoc文件。

这个all.adoc文件就是用来执行生成html和pdf的原始代码。我的all.adoc在IDEA中如下图:

8、执行如下两条maven命令即可生成HTML和PDF静态文档,我的生成后在IDEA中如下图:

  • mvn asciidoctor:process-asciidoc
  • mvn generate-resources

Swagger2在DBA Service中生成RESTful API的实践的更多相关文章

  1. 使用Swagger2构建SpringMVC项目中的Restful API文档

    使用Swagger自动生成API文档,不仅增加了项目的可维护性,还提高了API的透明度更利于快速测试等工作,便于更快地发现和解决问题. 本篇文章只记录整合过程,关于Security Configura ...

  2. Spring Boot学习笔记 - 整合Swagger2自动生成RESTful API文档

    1.添加Swagger2依赖 在pom.xml中加入Swagger2的依赖 <!--swagger2--> <dependency> <groupId>io.spr ...

  3. 整合swagger2生成Restful Api接口文档

    整合swagger2生成Restful Api接口文档 swagger Restful文档生成工具 2017-9-30 官方地址:https://swagger.io/docs/specificati ...

  4. Spring Boot 集成 Swagger 生成 RESTful API 文档

    原文链接: Spring Boot 集成 Swagger 生成 RESTful API 文档 简介 Swagger 官网是这么描述它的:The Best APIs are Built with Swa ...

  5. 基于querybuilder的可根据现有数据表自动生成Restful API的dotnet中间件

    AutoApi 基于SqlKata Query Builder的可根据数据表自动生成Restful API的dotnet中间件 项目地址 Github Gitee 支持的数据库 MySql AutoA ...

  6. 在C#中使用RESTful API的几种好方法

    什么是Restful API REST 即Representational State Transfer的缩写.直接翻译的意思是"表现层状态转化". 它是一种互联网应用程序的API ...

  7. 我所理解的Restful API最佳实践

    一直在公司负责API数据接口的开发,期间也遇到了不小的坑,本篇博客算是做一个小小的记录. 1. 不要纠结于无意义的规范    在开始本文之前,我想先说这么一句:RESTful 真的很好,但它只是一种软 ...

  8. 我所认为的RESTful API最佳实践

    我所认为的RESTful API最佳实践 不要纠结于无意义的规范 在开始本文之前,我想先说这么一句:RESTful 真的很好,但它只是一种软件架构风格,过度纠结如何遵守规范只是徒增烦恼,也违背了使用它 ...

  9. Spring Boot中使用Swagger2生成RESTful API文档(转)

    效果如下图所示: 添加Swagger2依赖 在pom.xml中加入Swagger2的依赖 <!-- https://mvnrepository.com/artifact/io.springfox ...

随机推荐

  1. java的23种设计模式之建造者模式

    场景和本质 场景 本质 案例 原理 应用场景 场景和本质 场景 我们要建造一个复杂的产品.比如:神州飞船,Iphone.这个复杂的产品的创建.有这样一个问题需要处理:装配这些子组件是不是有个步骤问题? ...

  2. toString和valueOf

    toString 今天在看以前写的代码时,遇到某个老师的点评: var obj = {};var root = [1, 2, 3];obj[root.join(',')] = value; 一看到这个 ...

  3. PHP 导出网页表格如何对标签中的内容设置属性

    当在使用php导出excel表格的时候,有时需要将某一列专门设置成文本属性 方法: 在需要设置属性的的<td>标签中 添加  style='vnd.ms-excel.numberforma ...

  4. 10分钟进阶SpringBoot - 05. 数据访问之JDBC(附加源码分析+代码下载)

    10分钟进阶SpringBoot - 05. 数据访问之JDBC 代码下载:https://github.com/Jackson0714/study-spring-boot.git 一.JDBC是什么 ...

  5. 一个简单的爬取b站up下所有视频的所有评论信息的爬虫

    心血来潮搞了一个简单的爬虫,主要是想知道某个人的b站账号,但是你知道,b站在搜索一个用户时,如果这个用户没有投过稿,是搜不到的,,,这时就只能想方法搞到对方的mid,,就是 space.bilibil ...

  6. 从头认识js-基本概念(关键字,保留字,数据类型)

    语法 ECMAScript的语法大量借鉴了C及其他类C语言(如Java和Perl)的语法.因此,熟悉这些语言的开发人员在接受ECMSAScript更加宽松的语法时,一定会有一种轻松自在的感觉. 区分大 ...

  7. 【每日一包0018】fecha

    [github地址:https://github.com/ABCDdouyae...] fecha 比moment.js更加轻量级的时间解析和格式化包 format 用法:format(<Dat ...

  8. 原型模式故事链(3)--JS的数据类型、以及区别、区分、转化

    上一章--原型链讲解:传送门:https://segmentfault.com/a/11... 在上一章讲解原型链时提到了:所有的引用类型都有一个_proto_属性,称之为隐式原型.那么引用类型是什么 ...

  9. OC和C++混编需要注意的问题

    文章首发于github.io 2018-12-17 21:01:55 方案一 1. .c文件的identify and type右边栏修改为Objective-C source 2. Built se ...

  10. Vue请求第三方接口跨域最终解决办法!2020最终版!

    废话少说,再百度的近三个小时尝试了近10种方法无解后,终于皇天不负有心人! 这个vue axios 跨域问题被我解决了! 需求:请求客户端ip地址获取客户ip,再根据ip获取用户位置 工具:Vue,a ...