构建 API 的7个建议【翻译】

迄今为止,越来越多的企业依靠API来为客户提供服务,以确保竞争的优势和业务可见性。出现这个情况的原因是微服务和无服务器架构正变得越来越普遍,API作为其中的关键节点,继承和承载了更多业务。
在这个前提下,API 的设计需要考虑到哪些方面就尤为重要。在本文中,笔者将讨论有助于构建的 API 的7个建议(这些见解基于笔者为移动客户端构建 API 的经验,但可以更广泛地用于任何类型的API)。
| 将 API 视为产品
在开始任何类型的开发时,产品的概念都是最为关键的因素,产品是向用户展示有用的功能和好处的单独个体,这在 API 中也是一样。如果在开发过程中,没有强烈的责任感和主动意识,想要设计和完成一个易于使用、可扩展、正确记录和安全的 API 并非易事。
所以需要将 API 视为一个整体来看,从第一天开始就做好生产准备。因此,需要指派产品负责人将理想 API 的愿景传达给敏捷团队。开发人员和测试人员必须制定计划以使用最佳 API 实践,并避免常见错误。
| 使用 API 规范框架
通常,API 框架由涵盖从概念到生产的整个开发生命周期的工具库组成。虽然在开发 API 时遵守 OpenAPI/Swagger 之类的规范有点死板,但它提供了更好的工具规范性。能够在每次代码更改时生成文档、SDK 和 UI 交互点非常有用的,毕竟每个人都喜欢自动化。
如果关心标准并希望在描述的 API 时提供常规工具,那么国外的 Swagger、国内的 Eolink 都是非常可靠的选择,可以提前获得回报。

| 使用版本控制策略
API 会随着业务需求的变化而不断发展。作为产品,它会有一个特定的版本,因此客户会希望得到这个版本的正确响应。在客户不知道的情况下引入重大更改,更新已发布和使用的 API 接口就像定时炸弹一样,很容易出现问题,特别是当用户的手机上可能仍然安装了旧版本时。
有多种方法可以在 API 上强制执行版本控制信息,其中大多数 API 开发者选择将版本信息放在 URL 中,这确实很实用。例如,以下 URL 表示客户的资源端点:

及时更新适合业务的版本策略非常重要。不过,如果决定更新版本,提供警告、更新和其他机制会更让版本更新的影响更小。

| 使用过滤和分页
开发 API 时的一个常见错误是没有提供过滤或对结果分页的方法。当公开一个返回可随时间更改的项目列表的 API 时,我们需要建立分页策略。
原因很简单,客户端尤其是移动客户端,无法一次查看数百个列表项,通常只能显示前10个。如果 API 为每个请求返回整个数据库列表,那么会有大量资源被浪费并且性能显着下降。
现代框架提供了一种对结果进行分页的方法:对查询使用 LIMIT 和 OFFSET 语句。例如,通过下面的 MySQL 语句,返回总结果的一部分代码:

上面的语句将从数据库中检索第 6-16 行,所以还需要提供一个JSON响应,根据LIMIT参数给出指向该查询的第一页、下一页、上一页和最后一页的链接。


| 使用 REST 和 HATEOAS
REST 是一种经过验证和实践测试的设计 Web 服务的架构方法,它独立于任何底层协议。因此,它非常适合设计 API。通过使用 REST 原则,我们可以应用一些设计注意事项,例如:
将端点视为具有传统命名方案的资源。例如,如果要公开排序列表,可以公开以下端点:

如果想查找特定的排序,可以提供一个 ID 参数:

这种方法有几个优点,包括更好的一致性、可读性和连贯性。
促进无状态连接。这有助于使服务更具可扩展性,因为它们不会有在客户端和服务器通信之间保持状态的硬耦合约束。
在 HATEOAS 的帮助下,无需事先了解内部 URI 方案,即可在整个资源集中更轻松地导航。它通过提供一组相关链接来增强每个资源的响应模型,以便更轻松地与 API 交互,而无需查找规范或其他元数据服务。HATEOAS 的一种很好的格式是 HAL 规范。例如,这里是对特定文本资源的 HAL 响应,为记者公开相关链接:

| 保护端点
安全问题这是一定不能忽视的点。任何漏洞都可能导致严重的后果,甚至涉及法律问题。安全管控需要在开发过程的早期建立,理想情况下,API 需要由外部供应商进行评估。C.I.A 安全三原则(机密性、完整性和可用性)适用于以下情况:
机密性是通过添加适当的身份验证控制来实现的,这些控制为系统提供了一种方法来了解谁正在访问信息或站点。OAuth2 和 JWT 提供了一种实用且安全的方法控制身份验证。必须在所有公共端点使用 HTTPS 以确保安全通信。
完整性是通过使用访问控制和授权策略来防止未经授权的用户篡改数据来实现的。 基于角色的授权 是一个不错的选择。
可用性是通过建立速率限制、部分响应和缓存来实现的,以防止大量使用 API 资源甚至服务器被无限循环关闭。
| 使用监控和报告
虽然开发和测试 API 在这个过程中扮演着重要的角色,但真正的工作并没有就此结束。我们需要继续提供监控,甚至从代码部署到生产之后都要继续保持。如果出现问题,需要使用可操作的信息通知正确的人,以便通过任何必要的方式做出响应。这构成了开发 API 时的一种主动方法:监控与报告。只要保持谨慎,当端点问题出现时,我们就可以及时处理,防止任何灾难性故障。像 Eolink 也有这样的 API 监控工具,也可以帮助我们解决这个问题。

图中所使用的的接口管理工具是eolink,可以对不同类型的接口进行测试,在测试流程中也支持添加不同步骤,感兴趣可以自行使用:www.eolink.com
构建 API 的7个建议【翻译】的更多相关文章
- 用Apache Kafka构建流数据平台的建议
在<流数据平台构建实战指南>第一部分中,Confluent联合创始人Jay Kreps介绍了如何构建一个公司范围的实时流数据中心.InfoQ前期对此进行过报道.本文是根据第二部分整理而成. ...
- Android 优化APP 构建速度的17条建议
转载:http://www.jianshu.com/p/a1cc8f2e0877 较长的构建时间将会减缓项目的开发进度,特别是对于大型的项目,app的构建时间长则十几分钟,短则几分钟,长的构建时间已经 ...
- lumen 构建api(dingo api)
什么是 API API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力, ...
- Spring Boot中使用Swagger2构建API文档
程序员都很希望别人能写技术文档,自己却很不愿意写文档.因为接口数量繁多,并且充满业务细节,写文档需要花大量的时间去处理格式排版,代码修改后还需要同步修改文档,经常因为项目时间紧等原因导致文档滞后于代码 ...
- 优化Webpack构建性能的几点建议
Webpack 作为目前最流行的前端构建工具之一,在 vue/react 等 Framework 的生态圈中都占据重要地位.在开发现代 Web 应用的过程中,Webpack 和我们的开发过程和发布过程 ...
- springboot+mybatis-puls利用swagger构建api文档
项目开发常采用前后端分离的方式.前后端通过API进行交互,在Swagger UI中,前后端人员能够直观预览并且测试API,方便前后端人员同步开发. 在SpringBoot中集成swagger,步骤如下 ...
- ASP.NET WebAPI构建API接口服务实战演练
一.课程介绍 一.王小二和他领导的第一次故事 有一天王小二和往常一下去上早班,刚吃完早餐刚一打开电脑没一会儿.王小二的领导宋大宝走到他的面前,我们现在的系统需要提供服务给其他内部业务系统,我看你平时喜 ...
- springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验--异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档---jpa访问数据库及page进行分页---整合redis---定时任务
springboot学习-jdbc操作数据库--yml注意事项--controller接受参数以及参数校验-- 异常统一管理以及aop的使用---整合mybatis---swagger2构建api文档 ...
- ASP.NET Core WebApi构建API接口服务实战演练
一.ASP.NET Core WebApi课程介绍 人生苦短,我用.NET Core!提到Api接口,一般会想到以前用到的WebService和WCF服务,这三个技术都是用来创建服务接口,只不过Web ...
随机推荐
- C#/VB.NET 合并PDF页面
本文以C#及vb.net代码为例介绍如何来实现合并PDF页面内容.本文中的合并并非将两个文档简单合并为一个文档,而是将多个页面内容合并到一个页面,目的是减少页面上的空白区域,使页面布局更为紧凑.合理. ...
- tuandui last
组长博客链接### 组长博客 参考邹欣老师的问题模板进行总结思考### 设想和目标(2分)#### 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 解决的问题 ...
- Nginx中FastCGI参数的优化配置实例
在配置完成Nginx+FastCGI之后,为了保证Nginx下PHP环境的高速稳定运行,需要添加一些FastCGI优化指令.下面给出一个优化实例,将下面代码添加到Nginx主配置文件中的HTTP层级. ...
- Json序列化与反序列化导致多线程运行速度和单线程运行速度一致问题
紧跟上篇文章 十个进程开启十个bash后一致写入命令执行完毕之后产生了很多很多的文件,博主需要对这些文件同意处理,也就是说对几十万个文件进行处理,想了又想,单线程处理那么多数据肯定不行,于是乎想到了使 ...
- 3┃音视频直播系统之浏览器中通过 WebRTC 直播视频实时录制回放下载
一.录制分类 在音视频会议.在线教育等系统中,录制是一个特别重要的功能 录制一般分为服务端录制和客户端录制 服务端录制:优点是不用担心客户因自身电脑问题造成录制失败(如磁盘空间不足),也不会因录制时抢 ...
- css,html实现元素超出部分省略号
.line-1 { height: 25px; width: 200px; overflow: hidden; text-overflow: ellipsis; display: -webkit-bo ...
- 印尼医疗龙头企业Halodoc的数据平台转型之数据平台V2.0
1. 摘要 数据平台已经彻底改变了公司存储.分析和使用数据的方式--但为了更有效地使用它们,它们需要可靠.高性能和透明.数据在制定业务决策和评估产品或 Halodoc 功能的性能方面发挥着重要作用.作 ...
- MySQL分库分表-理论
分库分表的几种方式 把一个实例中的多个数据库拆分到不同的实例 把一个库中的表分离到不同的数据库中 数据库分片前的准备 在数据库并发和负载没有达到限制时,不推荐水平拆分 对一个库中的相关表进行水平拆分到 ...
- 图解Dijkstra算法+代码实现
简介 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的 ...
- 大白话讲Java的锁
偏向锁 对一个对象的锁偏向于某个线程,在markword中记录线程id 下次相同的线程来,直接就可以获取锁 轻量级锁 对象的Markword记录锁地址 跟线程栈里面的锁记录Lock Record的锁地 ...