您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

如何设计一个良好的API接口?

时间:2022-04-27 14:07:48  来源:博客园  作者:海椰人

API是软件系统的核心,而我们在设计API接口的时候会面临着非常多的挑战:

  • 场景上来看,它是多样的,如何设计一个随处适用的API?
  • 我们所参与的业务不断演进的,如何设计一个有兼容性的API?
  • 我们的软件流程是协同开发的,那我们如何实现对API的统一认知?

今天我想和大家探讨一下如何设计一个良好的API接口,我觉得好的API设计需要同时考虑到这几个要素:标准化、兼容性、抽象性、简单性、高性能,可以说这几个要素缺一不可。

如何设计一个良好的API接口?

 

标准化

对于Web API标准化而言,一个非常好的案例就是Restful API。目前业界的Open API多数是基于Restful API规范设计的。

1、等级模型

需要注意的是Restful API它具有成熟度的模型。

  • 其中Level 0是普通的请求响应模式。
  • Level 1引入了资源的概念,各个资源可以单独创建URI,与Level 0相比,它通过资源分而治之的方法来处理复杂问题。
  • Level 2引入了一套标准的HTTP协议,它通过遵守HTTP协议定义的动词并配合HTTP响应状态码来规范化Web API的标准。
  • Level 3中,使用超媒体可以使协议拥有自我描述的能力。

通常情况下,成熟度模型中达到Level 2就已经非常好了。

如何设计一个良好的API接口?

 

2、URI

在Restful API中,每一个URI代表着一种资源,是每一个资源的唯一定位符。所谓资源,它可以是服务器上的一段文本、一个文件、一张图片、一首歌曲,或者是一种服务。

如何设计一个良好的API接口?

 

Restful API呢,规定了通过get/post/put/patch/delete等方式对服务端的资源进行操作。

因此,我们在定义一个Web API的时候,需要明确定义出它的请求方式、版本、资源名称和资源ID。

如何设计一个良好的API接口?

 

举个例子,要查看用户编码是101的用户信息,我可以定义get的请求方式,而他的版本是V1,资源名称是users,资源ID是1001。

如何设计一个良好的API接口?

 

这里可以思考一下,如果存在多个资源组合的情况呢?

事实上还可引入子资源的概念,需要明确定义出它的请求方式、版本、资源名称与资源ID,以及子资源名称与此资源ID。

如何设计一个良好的API接口?

 

举个例子,要查看用户编码是101的用户的权限信息,我可以定义get的请求方式。而他的版本是V1,主资源名称是Users,主资源ID是1001子资源名称是Roles,资源ID是101。

如何设计一个良好的API接口?

 

有时候,当一个自然变化难以使用标准的Restful API来命名时,就可以考虑使用一些特殊的actions命名。

比如密码修改接口,我可以定义Put的请求方式,而他的版本是V,主资源名称是users,主资源ID是101资源字段是password。然后定义一个action的操作是modify。

如何设计一个良好的API接口?

 

3、错误码和返回机制

与此同时啊,建议不要试图创建自己的错误码和返回错误机制。

很多时候呢,我们觉得提供更多的自定义的错误码有助于传递信息,但其实,如果只是传递信息的话,错误信息字段可以达到同样的效果。

此外,对于客户端来说,很难关注到那么多错误的细节,这样的设计只会让API的处理变得更加复杂,难于理解。

因此,我的建议是遵守Restful API的规范,使用HTTP规范的错误码。例如,我们用200表示请求成功,用400表示错误的请求,而500则表示服务器内部的错误。

如何设计一个良好的API接口?

 

当Restful API接口出现非200的HTTP错误码响应时,可以采用全局的异常结构响应信息。

4、返回体结构

这里列出了最为常用的几个字段,讲一下它们各自表示的含义。

  • 其中code字段用来表示某类错误的错误码,例如前面介绍的无效请求、缺少参数、未授权资源、未找到资源、已存在的错误。
  • 而message字段用来表示错误的摘要信息,它的作用是让开发人员能快速识别错误。
  • server_time字段,用来记录发送错误时的服务器时间,他可以明确的告诉开发人员发生错误时的具体时间,便于在日志系统中根据时间范围来快速定位错误信息。
如何设计一个良好的API接口?

 

此外,不常用字段会根据不同的情况做出有不同的响应。

如果是单条数据,则返回一个对象的json字符串;如果是列表数据,则返回一个封装的结构体,其中涵盖count字段和item字段。

如何设计一个良好的API接口?

 

count字段表示返回数据的总数据量。需要注意的是,如果接口没有分页的需求,尽量不要返回这个count字段,因为查询总数据量是耗性能的操作。

此外,item字段表示返回数据列表,他是一个json字符串的数组。

5、小结

总结一下,怎么来理解规范呢?可以说他就是大家约定俗成的标准,如果都遵守这套标准,自然沟通成本也就大大降低了。

兼容性

接着我们再来探讨一下API接口的兼容性。由于我们参与的业务是不断演进的,设计一个有兼容性的API就显得尤为重要了。如果接口不能够向下兼容,业务就会受到很大影响。

例如:

  • 我们的产品是涵盖AndroidIOS、pc端的,都运行在用户的机器上,这种情况下,用户必须升级产品到最新的版本才能够更好的使用。
  • 同时,我们还可能遇到服务端不停机升级,由于API不兼容而遇到短暂的服务故障。

为了实现API的兼容性,我们引入了版本的概念,前面的案例URI中通过保留版本号实现了兼容多个版本。

如何设计一个良好的API接口?

 

举个例子,针对要查看用户编码是1001的用户信息,可以分别定义V1和V2两个版本的API接口,然后分别让他们对应两套不完全兼容的业务逻辑特性。

抽象性

通常情况下,我们的接口抽象都是基于业务需求的,因此我们一方面要定义出清晰的业务问题域模型,例如数据模型和领域模型等,并建立起某个问题的现实映射,这样有利于不同的角色对API设计认知的统一。

另一方面,API设计如果可以实现抽象,就可以很好的屏蔽具体的业务实现细节,为我们提供更好的可扩展性。

简单性

简单性的主要宗旨是遵守最少的知识原则。

怎么来理解呢?其实就是客户端不需要知道那么多服务的API接口,以及这些API接口的调用细节,比如设计模式的外观模式和中介者模式都是它的应用案例。

如何设计一个良好的API接口?

 

如图所示,外观接口将多个服务进行业务封装与整合,并提供了一个简单的API调用给客户端使用,这样设计的好处是什么呢?就在于客户端只需要调用这个外观接口就行了,省去了一些繁杂的步骤。

性能

同时,我们还需要关注性能,就比如说外观接口,虽然保证了简单性,但是增加了服务端的业务复杂度,同时,由于多服务之间的聚合,导致他们的接口性能也不是太好。

此外,我们还需要考虑字段的各种组合会不会导致数据库的性能问题。有时,我们可能暴露了太多字段给外部使用,导致数据库没有相应的索引而发生全表扫描。这种情况在查询的场景下非常常见,因此我们可以只提供存在索引的字段组合给外部调用。

Result<Void> agree(Long taskId,Long caseId,Configger configger)

在上面这个代码案例中,要求调用方必填taskId和caseId来保证数据库索引的使用,以进一步保证服务提供方的服务性能。

总结

今天给大家侧重探讨的是如何设计一个良好的API接口。

好的API设计需要我们同时考虑到标准化、兼容性、抽象性、简单性和高性能。

其中,标准化的关键在于尽可能少的创建自定义规范和机制,而是共同遵守业内标准,例如HTTP规范和Restful API规范。

通常情况下,我们会采取版本号来解决多版本的兼容性的问题。

抽象性需要确保能够定义出清晰的问题域模型,尽可能屏蔽具体的业务实现细节。

简单性是相对的,需要遵守最少知识原则,让调用方尽可能少的知道内部的调用细节,性能注意的细节就多了,这里主要强调了业务组合和参数组合场景。

如何设计一个良好的API接口?

 

文章来自
https://www.cnblogs.com/jackyfei/p/16182421.html



Tags:API接口   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
优雅实现API接口开关:让你的应用更可控
环境:SpringBoot2.7.121. 概述本文将介绍如何为API接口动态添加开关功能。通过这个功能,我们可以控制API接口的正常访问或显示提示信息。这有助于在开发和维护过程中更好地管...【详细内容】
2023-11-28  Search: API接口  点击:(109)  评论:(0)  加入收藏
OpenHarmony4.0发布:新增4000多个API接口,交互及隐私能力增强
钛媒体App 11月6日消息,以“技术筑生态,智联赢未来”为主题的第二届OpenHarmony技术大会在北京举办,活动中,OpenHarmony 4.0版本正式发布。据介绍,OpenHarmony4.0版本开发套件同...【详细内容】
2023-11-07  Search: API接口  点击:(144)  评论:(0)  加入收藏
API接口参数验证的必备神器,让你的代码更高效!
环境:Springboot2.6.121. 简介Spring Validation是一种轻量级的数据验证框架,主要用于对Java对象进行校验。它为数据验证提供了统一的接口和基本的校验功能,解决了数据校验这一...【详细内容】
2023-11-07  Search: API接口  点击:(305)  评论:(0)  加入收藏
API接口脱敏:如何安全地处理敏感数据?
环境:SpringBoot2.6.12API接口脱敏是一种保护敏感数据的重要方法。它涉及到在数据传输和存储过程中,将敏感数据替换为无意义或伪装的数据,以防止未经授权的访问和泄露。下面是...【详细内容】
2023-10-07  Search: API接口  点击:(317)  评论:(0)  加入收藏
详解API接口如何安全的传输数据
在Spring中我们通过继承RequestBodyAdviceAdapter实现对于请求的内容进行解密操作,实现ResponseBodyAdvice来对相应内容进行加密处理。接下来将详细讲解数据加解密的实现过程...【详细内容】
2023-08-28  Search: API接口  点击:(259)  评论:(0)  加入收藏
如何调用AI室内设计软件的API接口
在此篇干货教程中,我将以向大家介绍如何使用API接口调用和接入AI室内设计。让我们一起来了解吧!...【详细内容】
2023-08-17  Search: API接口  点击:(337)  评论:(0)  加入收藏
如何接入midjourney的api接口
在进行midjourney的API开发之前,首先需要了解如何接入、调用和申请midjourney的API接口。✨midjourney的API无法直接调用,需要通过触站AI来调用midjourney的API接口。...【详细内容】
2023-08-06  Search: API接口  点击:(251)  评论:(0)  加入收藏
如何搭建ai绘画软件,一个API接口即可实现
以触站AI的API接口为例,教大家如何搭建ai绘画网站!首先,我们在触站AI找到:API开放接口先来测试一下效果:调用触站AI绘画网站的API步骤操作:1. 注册账号并获取API密钥:首先,您需要在A...【详细内容】
2023-07-31  Search: API接口  点击:(295)  评论:(0)  加入收藏
OpenAI大更新,API接口升级,并降低价格
6月14日消息,OpenAI为了在生成式人工智能领域中保持竞争优势,正在升级文本生成模型,并降低价格。美国当地时间周二,OpenAI宣布发布了GPT-3.5 Turbo和GPT-4的新版本。其中,GPT-4是...【详细内容】
2023-06-14  Search: API接口  点击:(71)  评论:(0)  加入收藏
建立高效的API接口安全策略
前言伴随互联网革命快速创新发展,API 需求的日益剧增,针对 API 的攻击几乎遍布各个行业,据报道 2022 年全年平均每月遭受攻击的 API 数量超过 21 万,游戏、社交、电商、制造等行...【详细内容】
2023-05-26  Search: API接口  点击:(278)  评论:(0)  加入收藏
▌简易百科推荐
Meta如何将缓存一致性提高到99.99999999%
介绍缓存是一种强大的技术,广泛应用于计算机系统的各个方面,从硬件缓存到操作系统、网络浏览器,尤其是后端开发。对于Meta这样的公司来说,缓存尤为重要,因为它有助于减少延迟、扩...【详细内容】
2024-04-15    dbaplus社群  Tags:Meta   点击:(1)  评论:(0)  加入收藏
SELECT COUNT(*) 会造成全表扫描?回去等通知吧
前言SELECT COUNT(*)会不会导致全表扫描引起慢查询呢?SELECT COUNT(*) FROM SomeTable网上有一种说法,针对无 where_clause 的 COUNT(*),MySQL 是有优化的,优化器会选择成本最小...【详细内容】
2024-04-11  dbaplus社群    Tags:SELECT   点击:(1)  评论:(0)  加入收藏
10年架构师感悟:从问题出发,而非技术
这些感悟并非来自于具体的技术实现,而是关于我在架构设计和实施过程中所体会到的一些软性经验和领悟。我希望通过这些分享,能够激发大家对于架构设计和技术实践的思考,帮助大家...【详细内容】
2024-04-11  dbaplus社群    Tags:架构师   点击:(2)  评论:(0)  加入收藏
Netflix 是如何管理 2.38 亿会员的
作者 | Surabhi Diwan译者 | 明知山策划 | TinaNetflix 高级软件工程师 Surabhi Diwan 在 2023 年旧金山 QCon 大会上发表了题为管理 Netflix 的 2.38 亿会员 的演讲。她在...【详细内容】
2024-04-08    InfoQ  Tags:Netflix   点击:(5)  评论:(0)  加入收藏
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(9)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(16)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(13)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(9)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(14)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(10)  评论:(0)  加入收藏
站内最新
站内热门
站内头条