在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
源宝导读:Web应用程序一般都是前后端分离的基本架构,而前后端很可能分别是两拨人分别开发,前后端的接口连调成为高频沟通的对象,开发内耗最大的也在这个环节。本文将分享如何基于OpenAPI将前后端接口协议标准化和自动化,从而大幅降低开发内耗。 一、背景通常的前端开发中, 接口service层依靠人工阅读接口文档来手动书写, 然而大部分工作是重复的, 骨架是相同的,只是接口数据和接口路径等改变, 对于一个庞大的项目(比如接口数量几百个), 并且客户端存在多个情况下(比如h5和小程序还有android, IOS), 重复的劳动成倍增加, 而且维护起来也会非常麻烦和不可靠。 重复的工作是,后端开发人员开发了一套接口, 前端开发又书写了同样一遍接口, 而且还要生成文档, 而这些接口可以统一成一份与语言无关的结构化的描述, 前端可以利用code-gen自动生成可调用的service层。 而且对于现在基于Typescript前端的开发, 接口协议生成的数据interface应该直接拿来使用, 用来约束各个业务模块的数据结构, 如果要组合生成新的数据结构, 应该使用Typescript的高级类型来组合生成(比如Pick<>,Required<>, Partial<>, Omit<>), 这样前端的业务组件数据结构将和接口协议描述保持一致。 1.1 传统前端后端联调模式问题: 不可靠, 重复工作量, 低效
1.2 Typescript前端项目的特点1.2.1 可使用丰富的高级派生类型
1.2.2 开发过程数据结构优先
基于以上特点将数据结构定义来源单一化, 使业务数据定义更合理:
能不能通过某种接口协议自动生成Typescript的接口定义呢? 二、前后端联调的优化解决方案: 以API协议为中心
2.1 步骤2.1.1 基于Open API Specification (Swagger)协议的转换研究OAS用来定义一个标准的, 与编程语言无关的RESTFul API的接口, 可提供给计算机解析, 也可进行人工阅读和分析, 是一种能结构化描述API接口的约定, 而目前主流的文档生成工具都支持这种标准, 可实现个性化需求。 OAP协议可以用JSON Schema来定义, 详细可看: https://swagger.io /specification /v2/ 基本结构: 对应的Typescript示例: 2.1.2 生成Typescript目标代码实际项目中的分析 命名空间根据项目的业务模块来区分, 在Swagger协议中一般在tags里做为标记: 2.1.3 利用模板引擎mustache生成代码
2.2 实践结果参考了一个nodejs的开源转换工具, 修改增加了模板数据变量和模板:
后端生成的Swagger response中字段缺少必填属性和枚举属性, 生成的接口相应Typescript数据结构都是可选参数。 遇到的问题:类似递归的结构暂时无法生成: 不需要看api文档, 却能发现文档的很多问题:接口定义了一个query参数 还有一个类型为json的body参数。 2.2.1 带来的优势
前端的接口调用参数, 描述等任何信息将与协议一键同步。
如果业务逻辑上接口发生变化, 将会自动影响相关的业务组件, 按照Typescirpt的提示能完成绝大部分工作。
前端不需要再去查看API文档, 手动同步书写接口代码, 后期维护也是维护源头的协议。 三、结合Typescript开发模式进一步优化 假设所有的模块都是具有完备的typescript设计和定义,为什么运行时还是会报语法错误, 类型错误? 3.1 在数据进入组件之前进行纠错, 前端0错误成为可能 假设服务端的数据完整性是不可靠的, 比如对象和数组可能是null, 但是协议定义的却是必要的, 不能是null, 这样给前端运行时带来风险, 所有对这些空字段可以做空默认值处理, 这个操作可以在前端获取到数据的时进行校验并赋予默认值, 这样业务组件拿到的数据不会存在空类型操作错误。 四、总结与展望
------ END ------ 作者简介 杨同学: 前端工程师,目前在云技术创新中心负责DMP产品的研发工作。 也许您还想看 |
请发表评论