写点什么

聊聊接口文档的事儿

作者:京茶吉鹿
  • 2023-04-03
    四川
  • 本文字数:4593 字

    阅读完需:约 15 分钟

聊聊接口文档的事儿

1、前言

大家好,欢迎来到我的吉鹿(记录)空间。


最近在做一个前后端分离的项目时,由于后端提供的 API 接口文档实在是一言难尽,导致了开发的效率大大降低。于是我出手了,我决定薅完我 20 几年的头发来肝一下接口文档。下面给大家介绍一下,如何正确的在自己的项目中使用接口文档。

2、简介

2.1、什么是接口文档?

接口文档又称为 API 文档,通常由开发人员一起规定的一种规范,一般由后端开发人员所编写的,用来描述系统所提供接口信息的文档。 前端人员直接调用某一个接口就可以实现某一个业务流程所需要的数据等信息。

2.2、为什么要写接口文档?

  1. 项目开发过程中前后端开发人员更加方便。

  2. 项目迭代或者项目人员更迭时,方便后期人员的维护。

  3. 为测试人员进行接口测试提供便利。

3.3、接口文档如何选择?

一个合格的接口文档是十分重要的,规范的文档可以很大程度的提高工作效率,尤其是对于接口测试而言。


合格的接口文档包含了:项目介绍、业务介绍、环境介绍、项目设计的请求和各个请求方式的传参格式和请求内容以及返回值等。对于一个功能很多的项目来说,接口是非常多的,基本都是上千个,那么为了实现更好的文档管理和阅读的目的,就需要对接口文档根据模块进行划分,不同的模块的划分也有不同的要求。这些都是实现一个合格的接口文档所需要具备的条件。竟然一个接口文档需要花费如此功夫,那么如何编写合格的接口文档呢?


手写接口文档?不可能,这辈子都不可能!当然是用 Swagger 接口文档工具了

4.4、如何使用 Swagger 接口文档?

废话不多说?走,整点儿东西!


到官网去巴拉几下:http://swagger.io ,了解基本用法,如果有看不懂英文的小伙伴,我在下面贴心的为大家准备了 Swagger 基本的模板,下面就简单介绍下 Swagger 基本用法吧。

3、Swagger

3.1、准备阶段

先新建 Spring Boot 工程,然后引入依赖,只需要引入一个版本即可


<!-- Swagger2.9.2 --><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><!-- Swagger3.0.0 --><dependency>    <groupId>io.springfox</groupId>    <artifactId>springfox-boot-starter</artifactId>    <version>3.0.0</version></dependency>
复制代码


<h4 style="color:green">备注:项目使用的 Spring Boot 版本为 2.5.5,如果使用更高版本的 Spring Boot 需要在 application.yml 添加如下配置</h4>


spring:    mvc:        path match:            matching-strategy: ant_path_matcher
复制代码

3.2、配置 Swagger

新建 Swagger2Config.java


Swagger 配置参考:http://springfox.github.io/springfox/docs/current/#quick-start-guides


下面的配置方式不仅仅适用于 Swagger 2.9.2 也适用于 Swagger 3.0.0 版本,但是在 3.0.0 版本中有小部分做了修改,详细体现在代码中的注释处。


@Configuration@EnableSwagger2  // 2// @EnableOpenApi      // 3public class Swagger2Config {    @Bean    public Docket createRestApi(){        return new Docket(DocumentationType.SWAGGER_2)  // 2        // return new Docket(DocumentationType.OAS_30)  // 3                .pathMapping("/")                .enable(true)                .host("localhost:8888")                .apiInfo(apiInfo())                .select()                .apis(RequestHandlerSelectors.basePackage("com.record.controller"))                .paths(PathSelectors.any())                .build()                .protocols(newHashSet("https","http"))  // 2                .securitySchemes(singletonList(apiKey()))                .securityContexts(singletonList(securityContext()));    }    private ApiInfo apiInfo() {        return new ApiInfoBuilder()                .title("京茶吉鹿")                .description("京茶吉鹿的Demo (SpringBoot2.5.5 + Swagger2.9.2)")                .contact(new Contact("京茶吉鹿", "http:localhost:8888/doc.html", "jc.jingchao@qq.com"))                .version("1.0.0")                .termsOfServiceUrl("http://localhost:8888")                .build();    }    private ApiKey apiKey(){        return new ApiKey("Authorization", "Authorization", "Header");    }    private SecurityContext securityContext(){        return SecurityContext.builder()                .securityReferences(defaultAuth())                .forPaths(PathSelectors.regex("/hello/.*"))                .build();    }    List<SecurityReference> defaultAuth() {        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];        authorizationScopes[0] = authorizationScope;        return singletonList(                new SecurityReference("Authorization", authorizationScopes));    }}
复制代码

3.3、访问接口文档

访问路径:


  • Swagger2.9.2 http://localhost:8888/swagger-ui.html

  • Swagger3.0.0 http://localhost:8888/swagger-ui/index.html


UI 界面如下


3.4、使用第三方的 UI

虽然我们已经实现了 Swagger 接口文档,但是我们会发现 Swagger 自带的接口文档页面并不是我们喜欢的方式,我们可以使用第三方的界面,只需要引入下面的依赖,使用 http://localhost:8888/doc.html 就可以访问了


<dependency>    <groupId>com.github.xiaoymin</groupId>    <artifactId>swagger-bootstrap-ui</artifactId>    <version>1.9.6</version></dependency>
复制代码


UI 界面如下


到此为止,一个完整的接口文档我们已经实现了。原生的 Swagger 就能够满足我们在开发中的使用,尽管我们也使用了第三方的 Swagger UI 资源库来美化我们的界面,但是由于 swagger-bootstrap-ui 采用的是后端 Java 代码 + 前端 Ui 混合打包的方式,与今天的微服务架构显得格格不入,下面将使用 knife4j 来重新生成接口文档


如果你还不想使用 knife4j ,但是你中意与它的外表(UI 界面)那么你可以使用引入下面的依赖来替换掉旧版本的 UI

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-ui</artifactId>
    <version>3.0.3</version>
</dependency>

UI 界面如下,界面更加美观,神似一个后台管理系统的 UI 界面,同时还可以切换语言,更加值得称赞的是还能进行界面的个性化配置。唯一比较遗憾的是由于你只使用了新版的皮肤,不能体会到接口文档的一些增强特性。


看到此处如果 knife4j 仍然不能是你心动,那么你无需再看下面的内容了。

4、knife4j

4.1、什么是 knife4j?

knife4j 是为 Java MVC 框架集成 Swagger 生成 Api 文档的增强解决方案,前身是 swagger-bootstrap-ui,取名 kni4j 是希望她能像一把匕首一样小巧,轻量,并且功能强悍!


Knife4j 的主要两点:


  • 🆕统一各个组件版本号,使用 Knife4j 时开发者根据需要自行引用,artifactId 发生了变化

  • 💯支持Spring Boot 3

  • 🌼兼容适配springdoc-openapi底层框架,全面迁移到OpenAPI3的规范支持

  • 🌿针对 OpenAPI2(Swagger)规范提供了优化,开发者基于 Spring Boot2 版本可以无缝衔接

  • 💪Knife4j-Desktop 组件架构升级重写,新架构支持不同需求的 OpenAPI 规范进行聚合

  • 💪提供官方 Docker 镜像服务,基于 Knife4j 可方便在云服务上进行使用

  • 💥官网文档更新重写


Knife4j 架构


4.2、为什么使用 knife4j?

  • 前后端 Java 代码以及前端 Ui 模块进行分离,在微服务架构下使用更加灵活

  • 提供专注于 Swagger 的增强解决方案,不同于只是改善增强前端 Ui 部分

4.3、使用 knife4j

下面环境为 SpringBoot 3.0.1 + Knife4j 4.0.0 ,注意项目使用的 JDK 版本需要在 17 以上。


引入 Knife4j 的 starter


<dependency>    <groupId>com.github.xiaoymin</groupId>    <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>    <version>4.0.0</version></dependency>
复制代码


引入 Knife4j 的 starter 后,其余的配置,可以完全参考 springdoc-openapi 的项目说明,Knife4j 只提供了增强部分,如果要启用 Knife4j 的增强功能,可以在配置文件中进行开启


# springdoc-openapi项目配置springdoc:  swagger-ui:    path: /swagger-ui.html    tags-sorter: alpha    operations-sorter: alpha  api-docs:    path: /v3/api-docs  group-configs:    - group: 'default'      paths-to-match: '/**'      packages-to-scan: com.xiaominfo.knife4j.demo.web# knife4j的增强配置,不需要增强可以不配knife4j:  enable: true  setting:    language: zh_cn
复制代码


配置文件


@Configurationpublic class SwaggerConfig {
@Bean public GlobalOpenApiCustomizer orderGlobalOpenApiCustomizer() { return openApi -> { if (openApi.getTags()!=null){ openApi.getTags().forEach(tag -> { Map<String,Object> map=new HashMap<>(); map.put("x-order", RandomUtil.randomInt(0,100)); tag.setExtensions(map); }); } if(openApi.getPaths()!=null){ openApi.addExtension("record","1223456"); openApi.getPaths().addExtension("x-record",RandomUtil.randomInt(1,100)); }
}; } @Bean public OpenAPI customOpenAPI() { return new OpenAPI().info(new Info() .title("京茶吉鹿系统API") .version("1.0.0") .contact(new Contact().name("京茶吉鹿").email("jc.jingchao@qq.com").url("https://gitee.com/OHUHO")) .description( "Knife4j集成springdoc-openapi示例") .termsOfService("http://localhost:8888") .license(new License().name("Apache 2.0") .url("http://localhost:8888"))); }}
复制代码


效果预览


4.4、使用增强特性

Knife4j 新版本已经将 UI 界面中的个性化配置剥离,只需要在后端进行配置即可。举个栗子,我们现在有这样一个需求,要给接口文档设置一个查看的权限(只有负责这个项目的前端人员才有资格查看),我们就可以为 API 文档设置密码,需要在配置文件中配置,如下


knife4j:  # 开启增强配置   enable: true # 开启Swagger的Basic认证功能,默认是false  basic:      enable: true      # Basic认证用户名      username: test      # Basic认证密码      password: 123
复制代码


到这里我们就学会了如何使用接口文档了,如果还需要了解更多的配置相信,可以参考 官网 ,同时我也为大家准备好了上面两个接口文档的 Demo,关注公众号【京茶吉鹿】,回复 Swagger 领取!

发布于: 53 分钟前阅读数: 6
用户头像

京茶吉鹿

关注

励志写最优美的代码! 2022-05-30 加入

关注微信公众号【京茶吉鹿】,给您分享实用的文章,推荐优质的项目!

评论

发布
暂无评论
聊聊接口文档的事儿_接口文档_京茶吉鹿_InfoQ写作社区