0

前后端接口同步及类型映射流程解析

 2 years ago
source link: https://jelly.jd.com/article/611f292706bf3b01910f323c
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
JELLY | 前后端接口同步及类型映射流程解析
前后端接口同步及类型映射流程解析
上传日期:2021.10.12
在 TypeScript 越来越火的今天,如何发掘 TS 的潜力,最大化的应用 TS 的能力来提高研发效率及开发体验,成了一个非常重要的实践方向。本文主要介绍了如何在前后端接口对接的研发流程中,充分利用 TS 的优势以及通用的接口规范来提升开发效率和开发体验。

在开始介绍整个流程之前,我们先来从头捋一捋

1、面临的问题

11d36b920f7b79f2.png

常见的接口对接方式

日常开发中前后端同学协作的一个非常典型的场景:接口数据请求的调用、处理

以往都是以手动编写的方式来进行协作,但是这种方式所带来的关联性十分脆弱,服务端的代码或者文档出现变动,前端关联的接口代码就会面临出错、失效的问题。

另外在 TypeScript 火热的现在,为了能充分利用 TS 的类型能力来规范接口的字段类型,通常我们也会根据接口文档来编写接口的类型定义。

11d36b920f7b79f2.png

毕竟,类型定义完备情况下,配合编辑器的提示,真的是太香了!

那么,代价是什么呢?

11d36b920f7b79f2.png

实际开发中,每个接口都可能存在大量的字段,这个时候去照着接口文档搬运类型定义,不得不说是非常枯燥无聊的,更别说在搬运的过程中也有出错的可能。

所以问题我们总结为以下两点

  • 以文档为媒介同步信息的关联性和约束性十分脆弱
  • 枯燥耗时的接口类型补全工作

2、理论可行性的建立

OK,问题明确了,要如何去解决呢?首先我们要确立理论上的可行性。

还是上面提到的场景

11d36b920f7b79f2.png

后端常见的实现:Java、NodeJs

前端常见的实现: JavaScript

虽然前后端实现的语言可能存在区别,但对于接口的发布与使用来说,其实是一一对应的。

那么既然都是用来描述具体业务的,即使是实现语言不同,通过某种转换方式,将强类型语言后端字段自身的定义,传递到前端配合 TS 使用,完全是可能的。

11d36b920f7b79f2.png

通过理论上的探索,我们可以得到两个结论:

  • 接口的发布与使用一一对应且存在一定的调用范式
  • 强类型后端有数据字段类型的完备定义

以及我们的目标:

  • 使用自动化任务来完成接口、类型的代码生成,达到前后端接口同步及类型映射的目的。

3、寻找相应的技术帮助实现

理论上的可行性确立了,我们还需要一些技术来帮助我们实现具体的功能:

3.1 OpenApi

首先是 OpenApi

11d36b920f7b79f2.png

OpenApi 规范定义了一个标准的、语言无关的RESTful API 接口规范

11d36b920f7b79f2.png

可以看到规范数据里会包含相应的接口信息及对象类型的定义,目的是为了通过一定的规范来覆盖不同语言实现的后端和不同终端的前端。

3.2 Swagger

另一个是 Swagger

11d36b920f7b79f2.png

Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务

使用生态提供的相关工具,可以帮助我们更快达成目标(让后端同学配合)

11d36b920f7b79f2.png

3.3 mustache

最后是 mustache

11d36b920f7b79f2.png

使用模板语法 mustache 来帮助我们减轻代码生成的字符拼接工作。

4、工程化流程实践

接下来让我们充分利用上面提到的工具,去实现整个处理流程。

11d36b920f7b79f2.png

对每个步骤逐一做一下说明

4.1 服务端的变动

11d36b920f7b79f2.png

服务端以 NestJs 为例

4.2 得到的全量接口信息

11d36b920f7b79f2.png

OpenApi数据示例

4.3 通过解析工具来整合数据

11d36b920f7b79f2.png

解析整合数据

4.4 依靠nodejs的文件处理能力和mustache的模板预发,批量生成代码和类型定义

11d36b920f7b79f2.png

编写 mustache 模板,最终批量生成代码

11d36b920f7b79f2.png

生成代码示例

当完成接口及类型的代码生成后,就可以很好的利用编辑器和 TS 的能力,帮助我们提升开发效率和开发体验

11d36b920f7b79f2.png

5、业界的解决方案

上面的流程解析中,大部分可以很好的利用相关的生态工具来实现,只有其中的数据解析整合 + 代码生成的部分需要我们考虑是寻找已有的方案还是根据自己的项目去实现

11d36b920f7b79f2.png

以下是几种方案:

  • swagger-api: Swagger 生态的代码生成工具,不过需要 java 运行环境
  • Pont: 阿里的接口 swagger 对接方案,支持 vscode 插件,十分强大
  • YAPI: 支持接口管理、MOCK等功能,代码生成需要 java 运行环境

通过整个流程的解析,相信不论是自己实现还是使用工具,都能非常好的帮助我们完成前后端的接口对接工作,效率和体验直线上升!

如果有什么建议或意见,欢迎交流!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK