Swagger---API 接口文档自动生成工具

Posted Linqylin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swagger---API 接口文档自动生成工具相关的知识,希望对你有一定的参考价值。

1、API 接口文档

  前后端分离开发模式中,在项目中会创建Restful风格的API接口,供第三方或前端人员使用,那么前端人员在使用的过程中如何知道有哪些接口以及接口详细信息呢?在实际开发中,一般通过写API接口文档来进行沟通交流。人工来维护API文档会带来很多问题,如不同的开发人员写的API文档不一样、文档的维护不方便、不能及时更新、文档中定义的接口与实际接口不一致等等,这些问题都会影响开发进度和开发质量。
  因此,在实际开发中,常用Swagger-API接口文档自动生成工具,帮助项目自动生成和维护接口文档。
  Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务,它具有以下特点:
  及时性:接口变更后,Api文档同步自动更新;
  规范性:遵守RESTful风格,保证接口的规范性,如接口的地址,请求方式,参数及响应格式和错误信息;
  一致性:接口信息一致,不会因开发人员拿到的文档版本不一致而导致分歧;
  可测性:直接在接口文档上进行测试,可以在线测试Api接口,方便理解业务。
 
2、 在 SpringBoot 项目中应用 Swagger
(1)在pom.xml中加入Swagger依赖
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
 
(2)开启Swagger
在项目的启动类上加上@EnableSwagger2注解,表示开启Swagger,同时它也支持自定义UI页面的一些信息。
 
(3)修改application.yml文件
因为 Swagger使用的路径匹配是基于AntPathMatcher的,而Spring Boot 2.7.X使用的是PathPatternMatcher。
因此,需要在application.yml里做如下配置
mvc:
pathmatch:
matching-strategy: ant_path_matcher
 
(4)启动项目,访问API在线文档页面
访问:http://localhost:8080/swagger-ui.html,即可看到接口文档信息
 
3 、定义 Swagger 配置类,自定义 API 文档信息
实现一个Swagger配置类,以实现对Swagger页面一些展示信息的定制化,例如添加作者,标题,描述等信息。
 
4、通过注解来完善 API 文档
(1)@Api注解: 用来标记当前 Controller 的功能。
位置:在controller前
格式:@Api(tags="……")
(2)@ApiOperation注解:用来标记一个方法的作用。
位置:在controller类中的方法前
格式:@ApiOperation(“……”)
(3) @ApiImplicitParam注解:用来描述一个参数,可以配置参数的中文含义,也可以给参数设置默认值,这样在接口测试的时候可以避免手动输入;
(4) @ApiModel :用在实体类上,主要属性有description(描述)、parent(父类)、subTypes、value、discriminator等;
(5) @ApiModelProperty:用在实体类属性上,主要属性有access、accessMode、allowableValues、allowEmptyValue(是否允许为空)、dataType(数据类型)、example(示例)、hidden(是否隐藏)、name(名称)、notes、required(是否必需)、value(说明)等。

Swagger API文档

接口文档是前后端开发对接时很重要的一个组件。手动编写接口文档既费时,又存在文档不能随代码及时更新的问题,因此产生了像swagger这样的自动生成接口文档的框架。swagger文档一般是随项目代码生成与更新,访问地址也是基于项目地址,因此对项目数不多的团队还好。如果团队的项目很多,比如采用微服务架构的团队,动则几十甚至上百个服务项目,那就意味着前端开发人员需要记住几十甚至上百个swagger文档地址,那就很不友好了。目前貌似还没有较流行的API文档集中化管理项目(也或者是我没找到),因此花了点时间自己集成了一个,介绍如下。

1. swagger-bootstrap-ui项目

该项目是github上的一个开源项目(https://github.com/xiaoymin/swagger-bootstrap-ui ),对swagger ui做了增强,功能整体看起来要丰富一些。来看看效果,

技术图片

该项目的调试url地址原本是基于自身服务的,我将它改为了注册服务的url地址,以支持注册服务的接口调试。调整后的源码地址: https://github.com/ronwxy/swagger-bootstrap-ui

2. swagger api注册服务

该项目集成了swagger-bootstrap-ui,并提供了swagger api注册接口,接受所有提供了有效配置的服务项目注册,让注册的服务在一个页面上可统一查看,再也不用记太多文档地址了。

技术图片

启动注册服务后,访问 http://localhost:11090/doc.html 打开文档页面。如上图,可通过下拉列表来选择不同项目,加载项目的接口文档查看或调试。
项目地址: 关注本文最后二维码公众号,回复“swagger”获取源码地址 (一个不只有实战干货的技术公众号,欢迎关注。如果觉得有用,不要吝啬你的star,反正又不要钱,O(∩_∩)O)

3. 服务端配置

在业务服务端,需要提供一些配置。
首先,需要配置一些Bean,如下提供了一个配置类(这里只列出了主要部分,完整代码参考: https://github.com/ronwxy/base-spring-boot)

技术图片
public class Swagger2AutoConfiguration 

    @Bean
    public Docket restApi() 
        ParameterBuilder builder = new ParameterBuilder();
        builder.name("x-auth-token").description("授权token")
                .modelRef(new ModelRef("string"))
                .parameterType("header")
                .required(false);
        return new Docket(DocumentationType.SWAGGER_2)
                .groupName(groupName)
                .select()
                .apis(RequestHandlerSelectors.basePackage(apisBasePackage))
                .paths(PathSelectors.any())
                .build()
                .globalOperationParameters(Collections.singletonList(builder.build()))
                .apiInfo(apiInfo());
    

    @Profile("dev")
    @Bean
    public CommandLineRunner swaggerRegistar(ConfigurableApplicationContext context) 
        return new SwaggerInfoRegistar(context);
    

    /**
     * use to register swagger api info url to swagger api registry;
     *
     * @author liubo
     */
    public class SwaggerInfoRegistar implements CommandLineRunner 
        @Override
        public void run(String... args) throws Exception 
            String url = buildLocalSwaggerDocsUrl();
            registerLocalSwaggerUrl(url);
        

        /**
         * register the v2/api-docs url
         *
         * @param url
         */
        private void registerLocalSwaggerUrl(String url) 
            RestTemplate restTemplate = new RestTemplate();
            restTemplate.getMessageConverters().add(new FormHttpMessageConverter());
            MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
            body.add("project", getApiTitle());
            body.add("url", url);
            ResponseEntity<Map> re = restTemplate.postForEntity(getSwaggerRegisterUrl(), body, Map.class);
            if (HttpStatus.OK.equals(re.getStatusCode())) 
                logger.info("swagger api registered success to ", getSwaggerRegisterUrl());
             else 
                logger.warn("swagger api registered failed []", re.getBody().get("msg"));
            
        
    

技术图片

该类完成了swagger的基本配置,同时将swagger的/v2/api-docs地址注册到了步骤2中介绍的注册服务。 

然后,因为要从注册服务端调用该业务服务的接口进行调试,存在跨域,因此服务需要做跨域支持,配置文件中添加如下定义,

技术图片
@Bean
@ConditionalOnMissingBean(name = "corsFilterRegistrationBean")
public FilterRegistrationBean corsFilterRegistrationBean() 
    UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();

    CorsConfiguration corsConfiguration = new CorsConfiguration();
    corsConfiguration.applyPermitDefaultValues();
    corsConfiguration.setAllowedMethods(Arrays.asList(CorsConfiguration.ALL));
    corsConfiguration.addExposedHeader(HttpHeaders.DATE);

    corsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);

    CorsFilter corsFilter = new CorsFilter(corsConfigurationSource);
    FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
    filterRegistrationBean.setFilter(corsFilter);
    filterRegistrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
    filterRegistrationBean.addUrlPatterns("/*");

    return filterRegistrationBean;
技术图片

 

最后,在属性配置文件application.yml中配置一些必要的属性,

swagger:
  api-title: Demo标题  #会展示在下拉列表框中,一般写项目名称
  api-description:  Demo描述,集中注册
  group-name: Demo项目
  apis-base-package: cn.jboost.springboot.swagger # API类所在包名
  swagger-registry-path: http://localhost:11090/swagger/register  #就是2中注册服务的注册接口地址

 

配置完后, 就可以像一般项目一样编写接口类,加swagger注解。项目启动时, 会自动向注册服务完成注册,刷新注册服务的文档页面即可在下拉列表看到。

4. 总结

本文介绍了一个基于swagger ui增强版项目swagger-bootstrap-ui的接口文档集中化管理实现。采用该实现,将所有swagger在线接口文档集中管理,有效提高前后端对接效率。

 

以上是关于Swagger---API 接口文档自动生成工具的主要内容,如果未能解决你的问题,请参考以下文章

Vue 使用typescript, 优雅的调用swagger API

java从Swagger Api接口获取数据工具类

Swagger.io - API 文档生成器

如何生成离线 Swagger API 文档?

Java后台管理系统:集成 Swagger API

xadmin引入drf-yasg生成Swagger API文档