如何 设计一个高质量的 API 接口?

news2024/9/24 23:28:47

目录

你是否也感同身受?

优秀API的特质

自解释

易学习

易使用

难误用

API 设计原则

1. 充分原则

2. 单一视角原则

3. 单一功能原则

4. 简单原则

5. 抽象原则

6. 兼容扩展原则

7. 最小惊讶原则

8. 低耦合原则

9. 正交原则

10. 易测试原则

11. 统一原则

 总结:


你是否也感同身受?

  • 对接XX业务时,XX业务具备的功能和API全靠跑业务负责人那反复逐个询问、确认。用哪个API;怎么用;有没有限制;等等

  • 各个业务间,甚至同一业务内,API风格不统一。

    • API命名:按自然语义全翻译的;按属性角度定义的;按操作角度定义的;动宾、非动宾的;复数、非复数的;等等
    • API入参:带Map的;相同语义字段名称不一样;
    • API出参:有包装Resoponse的;直接返回结果数据的;相同数据,返回格式和字段名称有差别的;
    • 错误信息:直接返回中文提示的;返回提示信息编码的;返回异常类型的;等等
  • XX业务API性能方面未知。

  • 随着业务的演进,开放的API持续在增加,但类同的很多

API编码规范迫在眉睫

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能。

项目地址:https://github.com/YunaiV/ruoyi-vue-pro

 

优秀API的特质

自解释

  • 从API本身一眼就能看懂API是干什么的,支持的用法,适用的场景,异常的处理等

易学习

  • 有完善的文档,以及提供尽可能多的示例和可copy-paste的代码。

易使用

  • 功能强大,但使用简单。不增加调用方的使用成本(例如要求业务方用API时需要额外的配置和依赖),不暴露复杂的细节、冗长的使用流程给调用方感知。调用方只做最小的感知和最少的传参。

难误用

  • 优秀的API可以使有经验的开发直接使用API而不需要阅读文档。
  • 充分的静态检查、动态校验、显式的异常说明、有效的错误提示。

基于微服务的思想,构建在 B2C 电商场景下的项目实战。核心技术栈,是 Spring Boot + Dubbo 。未来,会重构成 Spring Cloud Alibaba 。

项目地址:https://github.com/YunaiV/onemall

API 设计原则

1. 充分原则

不是随便一个功能就要有个接口,也不是随便一个需求就要加个接口。

每新建一个接口,要有充分的理由和考虑,即这个接口的存在是十分有意义和价值的。无意义的接口不仅增加了维护的难度,更重要是对于程序的可控性的大大降低,接口也会十分臃肿。

2. 单一视角原则

设计接口时,分析的角度要统一。否则会造成接口结构的混乱。例如:不要一会以角色的角度设计,一会儿就要以功能的角度设计。

推荐:以"属性对象 + 行为"的视角定义API

3. 单一功能原则

每个API接口应该只专注一件事,并做好。产品概念简单、关系清楚。功能模棱两可,诸多特殊逻辑的API肯定不是个优雅的API,且会造成功能类似重复的API。

注:如果API它很难命名,那么这或许是个不好的征兆,好的名称可以驱动开发、并且只需拆分与合并模块即可。

功能大而全的API在灵活性、简单性方面肯定捉襟见肘。定义API的粒度之前,建议先将业务分领域、划边界,以此来提取业务对象,然后再根据业务对象用例来设计单一功能的API。

比如:查询会员,可能除了查询会员表外还要获取该会员的其他必要信息,但不要在查询会员的同时还有修改权限等类似的其他业务功能,应该分成两个接口执行。

4. 简单原则

接口设计简单、清晰。API执行的功能可以很丰富、很强大,但API声明和用法一定要尽量的简单,不能将功能的丰富通过复杂的用法来实现,这会导致API功能不单一,演进不可控。

最终的评审要看API的简单易用程度。

  • 你写的例子,能不能让你的代码看起来更简单?
  • 你是不是强迫调用方关注/提供他们不在乎的选项/配置?
  • 有没有毫无价值的额外步骤?

编写的代码一定要易于读、易于理解,这样别人才会欣赏,也能够给你提出合理化的建议。相反,若是繁杂难解的程序,其他人总是会避而远之的。

               

 

5. 抽象原则

API的入参、出参所述的对象、属性,一定是按业务特性进行抽象后的实体。误将底层数据模型概念如实的反应到API上。抽象API、抽象对象实体更宏观,具有更好的适用性、兼容性、扩展性。

6. 兼容扩展原则

对扩展开放,对修改关闭。保证API的向后兼容。

扩展参数应当是便利的,保证后续类似的需求,可以在已有的API上通过兼容扩展的方式实现。

7. 最小惊讶原则

代码应该尽可能减少让读者惊喜。业务API只需根据需求来设计即可,不需要刻意去设计一下复杂无用、华而不实的API,以免弄巧成拙。

8. 低耦合原则

API应该减少对其他业务代码的依赖关系。低耦合往往是完美结构系统和优秀设计的标志。

耦合的种类:

  • 代码实现业务逆向调用。
  • 条件逻辑依赖耦合。例如:此API在处理国税网超订单类型时,需要额外发送结算支付凭证上传的事件MQ出来。
  • 耦合API无关的业务行为。例如:采购计划链路日志API被调用时,若是项目采购委托单的情况,需要额外调用公告的API拉取链路信息,新建成为一条此委托单的一条链路日志。

9. 正交原则

正交性是指改变某个特性而不会影响到其他的特性。

API之间的功能应该成正交性,无功能重合。API之间应该是互相补充的关系。

10. 易测试原则

对于API调用者而言,API应该是可被测试且易于被测试的。测试API不需要依赖额外的环境、容器、配置、公共服务等。

对可测试友好的API也是可被有效集成测试的前提。

11. 统一原则

API要具备统一的命名、统一的入/出参规范、统一的异常规范、统一的错误码规范、统一的版本规范等。

统一规范的API优点:

  • 易于被框架集成、处理
  • 有助于API调用方、API提供方开发经验复用
  • 避免犯错,避免误用

 总结:

感谢每一个认真阅读我文章的人!!!

我个人整理了我这几年软件测试生涯整理的一些技术资料,包含:电子书,简历模块,各种工作模板,面试宝典,自学项目等。欢迎大家点击下方名片免费领取,千万不要错过哦。

   Python自动化测试学习交流群:全套自动化测试面试简历学习资料获取点击链接加入群聊【python自动化测试交流】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=DhOSZDNS-qzT5QKbFQMsfJ7DsrFfKpOF&authKey=eBt%2BF%2FBK81lVLcsLKaFqnvDAVA8IdNsGC7J0YV73w8V%2FJpdbby66r7vJ1rsPIifg&noverify=0&group_code=198408628

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/696564.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎样查看电脑开关机日志

最近想查看家里电脑是否每天都正常关机了。 家里的是Windows电脑。 使用windows自带功能或者说自带工具无疑是最方便的。 按下【开始→运行】,输入eventvwr,按下回车键。 打开事件查看器,展开Windows日志,双击系统。 选择筛…

Redis内存满分析

操作0: dbsize计算db大小,判断是哪个db的问题,发现是db1的问题。 操作1: Redis中先备份xxx.rdb文件,然后使用下面的工具进行分析 Redis内存分析工具之redis-rdb-tools的安装与使用_薛定谔的猫io的博客-CSDN博客 结…

如何在Windows 10中移动文档文件夹位置

默认情况下,Windows将你的个人文档文件夹存储在你帐户的%UserProfile%文件夹中(例如:“C:\Users\Kent”)。 你可以将“文档”文件夹中文件的存储位置更改为硬盘驱动器、其他驱动器或网络上的其他计算机上的其他位置。 一、如果你当前的文档文件夹受 OneDrive 保护,那么你…

记录一个iOS无法找到堆栈信息的崩溃修复

崩溃提示 2023-06-28 21:14:46.9624560800 -[UIDynamicCatalogColor length]: unrecognized selector sent to instance 0x6000073292c0 崩溃如下图所示 思路,既然我们无法通过调用的堆栈信息查找,那就试试通过崩溃对象的内存地址查看该对象的详细信息 …

攻防世界-web-mfw

题目描述:如图,只有这样的三个页面 home页面: about页面: contact页面: burp抓包可以看到返回的html中刚好对应了三个页面,以及注释掉的flag 尝试将page设置成flag,但是并没有什么反应。 1. 思…

【Web 网络管理】网络杂谈(8)之基于 Web 的网络管理

涉及知识点 基于 Web 的网络管理模式,WBM的介绍与标准,WBM的实现方式与关键技术,WBM的安全性考虑。深入了解WBM技术。 原创于:CSDN博主-《拄杖盲学轻声码》,更多内容可去其主页关注下哈,不胜感激 文章目录…

污水厂3D可视化智慧大屏实现统一数据管理和信息化建设

随着城市化进程的加速和人口的不断增长,污水排放量也随之增加。3D可视化技术的出现,为污水厂的管理和运营带来了新的思路和方法。本文将探讨污水厂3D可视化智慧大屏系统的意义。 首先,污水厂3D可视化智慧大屏系统可以帮助管理人员更好地了解…

Unable to open debugger port (127.0.0.1:55305): java.net.BindException

如图idea启动服务端口被占用,如何解决 1.修改启动服务的端口 修改tomcat的启动端口,避免和windows已启动端口占用(不推荐) 2.杀死占用服务的端口 winR 打开命令行窗口 netstat -aon|findstr “55305” taskkill -f -pid 25512…

汽车租赁系统

汽车租赁系统,java,ssm,tomcat,mysql。包含数据库文件,源码,和项目运行演示介绍视频 idea和eclipse都可以运行。 系统介绍: 角色:管理员,用户 主要功能:汽车资…

解决 vue2 productionTip=false设置无效

原因:在最新版本的Chrome中,在script中使用settimeout,将在允许第一个js完成后立即回调。 第一种: 直接在源码中,将productionTip:true直接改成false 第二种,则是在红框位置改成大于0的任意数值…

建立无需build的react单页面SPA框架

vue、react这种前端渲染的框架,比较适合做SPA。如果用ejs做SPA(Single Page Application),js代码控制好全局变量冲突不算严重,但dom元素用jquery操作会遇到很多的名称上的冲突(tag、id、name)。…

PyTorch Lightning基础入门

Lightning in 15 minutes Lightning in 15 minutes — PyTorch Lightning 2.0.4 documentation 安装 PyTorch Lightning pip install lightning conda install lightning -c conda-forge 定义一个LightningModule LightningModule可以让pytorch的nn.Module可以整合一些训…

一般人不要轻易去学习网络安全(黑客)

笔者本人 17 年就读于一所普通的本科学校,20 年 6 月在三年经验的时候顺利通过校招实习面试进入大厂,现就职于某大厂安全联合实验室。 我为啥说自学黑客,一般人我还是劝你算了吧!因为我就是那个不一般的人。 首先我谈下对黑客&a…

Nacos报9848

问题: Connection refused: no further information: localhost/0:0:0:0:0:0:0:1:9848 解决: 这里是springboot集成springcloud后,把application.yml改成bootstrap.yml就可以了,不然读取不到nacos配置。

Java调用scala中map转换问题处理

网上代码 把Javamap转为scala的map代码 scala.collection.mutable.Map<String, String> scalaMap JavaConverters.mapAsScalaMapConverter(map).asScala();Object objMap Map$.MODULE$.<String, String>newBuilder().$plus$plus$eq(scalaMap.toSeq());Object Bui…

再以汇编代码分析c++的右值引用

汇编分析c语言的执行结果最为准确。 可见&#xff0c;右值引用其实还是引用&#xff0c; bb 和 cc 都是对 aa 的引用&#xff0c;其内存里存储了 aa 的地址。 而且还有一个很奇特的现象&#xff0c;bb无法给cc赋值&#xff0c;右值引用无法给右值赋值。 同样是调用std:: move…

更换电脑背景为纯黑色(真的一点其他颜色都没有)

1步2步可合并为第一步 1、控制面板 2、优化视觉显示 3、选中确定即可 查看电脑背景图片&#xff0c;纯黑色&#xff0c;无敌呦&#xff01; 你就说牛不牛 吧

惠普232dw/233dw激光打印机手机WIFI连接实操、初始化

0.首先建议&#xff0c;不要买这台垃圾&#xff0c;经常断网&#xff0c;链接不便 1.手机下载 惠普smart 2.长按i键 3.等到x和↓闪烁&#xff0c; 同时按住wifi和x键持续5秒以上&#xff0c;松开时开始自动初始化&#xff0c;等待一段时间&#xff0c;初始化完成&#xff0c…

零知识证明的示例

目录 零知识证明的示例 怎样通过零知识证明验证联邦学习中模型的真伪 零知识证明的示例 1、零知识洞穴 如图表示一个简单的迷宫&#xff0c;C与D之间有一道门&#xff0c;需要知道秘密口令才能将其打开。P向V证明自己能打开这道门&#xff0c;但又不愿向V泄露秘密口令。 可采…

DAY33:回溯算法(九)解数独(棋盘问题,二维递归)

37.解数独 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff09;…