聊聊接口文档的事儿

news/2024/9/16 22:22:55/

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>

备注:项目使用的 Spring Boot 版本为 2.5.5,如果使用更高版本的 Spring Boot 需要在 application.yml 添加如下配置

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      // 3
public class Swagger2Config {@Beanpublic 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 界面如下

image-20221230191215665

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 界面如下

image-20221230192316085

到此为止,一个完整的接口文档我们已经实现了。原生的 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 界面,同时还可以切换语言,更加值得称赞的是还能进行界面的个性化配置。唯一比较遗憾的是由于你只使用了新版的皮肤,不能体会到接口文档的一些增强特性。

image-20221231103733730

看到此处如果 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.htmltags-sorter: alphaoperations-sorter: alphaapi-docs:path: /v3/api-docsgroup-configs:- group: 'default'paths-to-match: '/**'packages-to-scan: com.xiaominfo.knife4j.demo.web
# knife4j的增强配置,不需要增强可以不配
knife4j:enable: truesetting:language: zh_cn

配置文件

@Configuration
public class SwaggerConfig {@Beanpublic 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));}};}@Beanpublic 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认证功能,默认是falsebasic:enable: true# Basic认证用户名username: test# Basic认证密码password: 123

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


http://www.ppmy.cn/news/8733.html

相关文章

谈谈SpringBoot

1. Spring Boot 简介 简化Spring应用开发的一个框架&#xff1b; 整个Spring技术栈的一个大整合&#xff1b; J2EE开发的一站式解决方案&#xff1b; 2. HelloWorld 功能&#xff1a;浏览器发送hello请求&#xff0c;服务器接受请求并处理&#xff0c;响应Hello World字符串&a…

【闲来无聊写个几个小特效——五角星,小光圈,探照灯】

五角星&#xff0c;见过吧&#xff0c;如果是你&#xff0c;你如何使用代码写一个五角星呢&#xff1f;思考一下&#xff0c;你会说&#xff0c;先这样在那样就好啦&#xff0c;可是真正上手的时候却修修改改磕磕绊绊来看一下今天的五角星如何用几行代码实现 1.绘制五角星 四行…

【ESP 保姆级教程】疯狂毕设篇 —— 案例:基于ESP8266和App的炫酷rgb ws2812彩灯控制

忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-01-01 ❤️❤️ 本篇更新记录 2022-01-01 ❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请…

C++string类介绍

目录 一、介绍 二、string类对象的构造 string类有如下构造方法&#xff1a; 类对象的容量操作 类对象访问及遍历 string对象的修改操作&#xff1a; std::string::insert std::string::erase std::string::c_str std::string::find std::string::substr 一、介绍…

将Android进行到底之内容提供者(ContentProvider)

文章目录前言一、ContentProvider是什么&#xff1f;二、使用示例1.为应用创建内容提供者2.使用内容提供者2.1 内容URI2.2 Uri参数解析2.2 使用内容URI操作数据3.ContentProvider妙用4 内容URI对应的MIME类型5.ContentProvider重点注意6 演示demo源码总结前言 随着现在的应用越…

[ASIS 2022 last CTF] 2022最后一赛

这个比赛太难了&#xff0c;就作了4个题 Crypto Bedouin 题目非常短&#xff0c;就是先生成一个小素数&#xff0c;然后堆到一起l次再补个1&#xff0c;比如235就变成2352352351这样&#xff0c;一开始以为是2进制&#xff0c;一直没作出来&#xff0c;方式也没错。后来发现原…

Unsupported conversion from LONG to java.sql.Timestamp

使用mybatisplus查询实体时报错Unsupported conversion from LONG to java.sql.Timestamp 先说结论&#xff1a; mybatis建议实体类上带上无参构造,当然java类虽然默认提供无参构造&#xff0c;但是现在都会用Data注解简化开发&#xff0c;里面会有 有参构造 所以默认的无参构造…

python自动化编程--正则表达式

目录 一.创建正则表达式 1.re模块 2.匹配Regex对象 二.正则表达式匹配更多模式 1.用括号分组 2.用管道匹配多个分组 3.用问号表示可选 4.用星号匹配零次或多次 5.用加号表示匹配一次或多次 6.用花括号匹配特定次数 三.贪心和非贪心匹配 四.字符分类 五.自定义字符…

QML教程(七) JavaScript

目录 一、对属性值使用 JavaScript 表达式 二、在 QML 中添加 JavaScript 函数 三、使用 JavaScript 文件 四、属性绑定中的 JavaScript 五、信号处理程序中的 JavaScript 六、将信号连接到 JavaScript 函数 七、启动执行 JavaScript QML 提供的 JavaScript 主机环境可以…

系统管理员喜欢 systemd 的 5 个理由

导读systemd 的速度和易用性使其成为管理现代 Linux 系统的流行方式。 系统管理员知道&#xff0c;在一台运行着的现代计算机上会发生很多事情&#xff1a;应用程序在后台运行、预定事件等待在特定时间被触发、事件写入日志文件、发送状态报告。在以前&#xff0c;不同的进程可…

2022年终总结与展望

2022年终总结 自2019年3月13日入驻CSDN&#xff0c;已经三年零九个月了。截至2022年12月31日&#xff0c;CSDN博客已发原创博文112篇&#xff0c;粉丝3616个&#xff0c;访问量超过157万次。 2019年12月31日数据情况&#xff1a; 2020年12月31日数据情况&#xff1a; 2021年1…

JAVA练习8

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、题目1- 1.题目描述 2.思路与代码 2.1 思路 2.2 代码 二、题目2- 1.题目描述 2.思路与代码 2.1 思路 2.2 代码 总结 前言 提示&#xff1a;这里可以…

数据结构(一)

单链表 // head存储链表头&#xff0c;e[]存储节点的值&#xff0c;ne[]存储节点的next指针&#xff0c;idx表示当前用到了哪个节点 int head, e[N], ne[N], idx; // 初始化 void init() { head -1; idx 0; } // 在链表头插入一个数a void insert(int a) { e[idx] a, ne[i…

mysql事务一致性,原子性,持久性实现以及锁区别

Mysql事务一致性&#xff0c;原子性是如何实现的? 首先是通过锁和mvcc实现了执行过程中的一致性和原子性 其次是在灾备方面通过Redo log实观&#xff0c;Redo log会把事务在执行过程中对数据库所做的所有修改都记录下来&#xff0c;在之后系统崩溃重启后把事务所做的任何修改都…

Faster RCNN网络源码解读(Ⅸ) --- ROIAlign、TwoMLPHead、FastRCNNPredictor部分解析

目录 一、回顾以及本篇博客内容概述 二、代码解析 2.1 FasterRCNNBase类 2.1.1 forward正向传播 2.2 FasterRCNN类 2.2.1 roi_heads定义 2.3 TwoMLPHead类&#xff08;faster_rcnn_framework.py&#xff09; 2.4 FastRCNNPredictor类 2.5 RoIHeads类&#xff08;roi_…

四【Servlet基础】文件配置及环境搭建(重要)

文章目录4.1 Servlet概念4.2 Servlet作用4.3 Servlet开发步骤4.3.1 搭建开发环境4.3.2 创建项目4.3.3 部署Servlet4.3.4 配置Servlet4.3.5 测试运行4.1 Servlet概念 &#xff08;1&#xff09;Servlet&#xff1a;Server Applet的简称&#xff0c;是运行在Web服务器端的Java程…

2.0、Linux-基础了解

2.0、开机关机和基本目录介绍 开机登录&#xff1a; 开会机会启动许多程序&#xff1b;他们在Windows叫做 "服务" &#xff0c;在 Linux 中叫做 "守护进程"&#xff08;daemon&#xff09;&#xff1b; 开机成功后&#xff0c;他会显示一个文本登录…

【网络】网络发展,网络协议,网络传输流程,地址管理

目录 1.计算机网络背景 1.1网络发展 局域网和广域网 1.2 协议 2.网络协议初识 2.1协议分层 2.2OSI七层模型 2.3 TCP/IP 五层&#xff08;或四层&#xff09;模型 网络和操作系统之间的关系 2.4重谈协议 -- 计算机的视角&#xff0c;如何看待协议&#xff1f; 2.5 网…

【MySQL】MySQL存储过程与存储函数实战(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

第三十六讲:无线AP胖AP模式配置与管理

胖AP(Fat AP)配置一个开放式WLAN非常方便&#xff0c;需要完成的操作包括有线和无线两部分的配置。有线部分即ethernet接口的配置&#xff0c;保证AP能够接入Internet,无线部分的配置包括关联WLAN与VLAN&#xff0c;广播SSID,启用VAP&#xff0c;若无其他DHCP服务器的话&#x…