对于试图完善其 API 策略的团队来说,良好的 API 设计是一个经常出现的话题。

API 设计的重要性相信不需要赘述,精心设计的 API 的好处包括:更好开发人员体验、更快的文档编制以及更高的 API 使用率。

那么好的API设计到底是什么?这篇文章将详细介绍一些设计 RESTful API 的最佳实践。

| 精心设计的 API 的特征

一般来说,一个有效的 API 设计将具有以下特点:

*** 易于阅读和使用。**一个设计良好的 API 通常都易于使用,并且它的资源和相关操作可以被不断使用它的开发人员快速记住。

*** 难以滥用。**实现和集成具有良好设计的 API 是一个直截了当的过程,出现代码编写不正确的可能性会更小。它具有信息性反馈,并且不会强迫 API 的最终使用者遵守严格的规范。

*** 完整而简洁。**最后,完整的 API 能让开发人员针对公开的数据制作成熟的应用程序。大多数 API 设计人员和开发人员会在现有 API 的基础上逐步构建,使应用程序的完整性随时间推移而提高。这是每个拥有 API 的工程师或公司在努力实现的目标。

接下来的部分会以照片共享应用程序为例,说明一些概念。该应用程序允许用户上传照片,用这些照片的拍摄地点和描述与之相关的情绪的主题标签来表述。

| 集合、资源及其 URL

了解资源和集合

资源是 REST 概念的基础,它是一个非常重要的对象,可以被自身引用。资源具有数据、与其他资源的关系以及对其进行操作以允许访问和操作相关信息的方法。

一组资源称为一个集合。集合和资源的内容取决于组织机构和使用者的要求。例如,如果某组织认为自身某产品用户群的基本信息可以为组织带来利益,就可以尝试将其作为集合或资源公开,比如像qq在内的各种快捷登录。

统一资源定位符 (URL) 标识资源的在线位置。此 URL 指向 API 资源所在的位置。base URL 是此位置的一部分。

在照片共享应用程序中,我们可以通过适当的 URL 访问的集合和资源公开有关使用该应用程序的用户的数据。

名词可以更好地描述 URL

base URL 应该整洁、优雅且简单,以便使用该产品的开发人员可以轻松地在他们的 Web 应用程序中使用它们。一个又长又难读的基本 URL 不仅不好看,而且在尝试重新编码时也容易出错。以名词命名 URL 应该始终被作为最优解。

我们在设计时,通常没有关于保持资源名词单数或复数的规范,但建议保持集合复数。在所有资源和集合中分别使用相同的复数是一种很好的做法,可以保持描述的一致性。

保持这种命名方式,有助于开发人员理解URL所描述的资源类型,方便他们快速使用这些 API。

说回照片共享应用程序,假设它有一个公共 API,其中包含 /users 和 /photos 作为集合。一目了然,这些都是复数的名词。由此我们可以推断出 /users 和 /photos 分别提供有关产品注册用户群和共享照片的信息。

使用 HTTP 方法描述资源功能

所有资源都有一组可以针对它们进行操作的请求方法,用以处理 API 公开的数据。

RESTful API 主要由 HTTP 请求方法组成,这些请求方法对任何资源具有明确定义的独特操作。以下是常用 HTTP 请求的列表,这些请求定义了 RESTful API 中任何资源或集合的 CRUD 操作。

将动词排除在 URL 之外是一个好主意。GET、PUT、POST 和 DELETE 操作已用于对 URL 描述的资源进行操作,因此在 URL 中使用动词而不是名词会使处理资源变得混乱。

在照片共享应用程序中,以 /users 和 /photos 作为端点,API 的最终使用者可以使用上述 RESTful CRUD 操作轻松直观地使用它们。

| 响应

提供反馈以帮助开发人员取得成功

在开发人员使用产品时,提供的良好的反馈响应,对提高使用率和留存率大帮助极大。每个客户端请求和服务器端响应都是一条消息,在理想的 RESTful 生态系统中,这些消息必须是自描述的。

好的反馈包括对正确实现的自动验证,以及对不正确实现的详细报错。这可以帮助用户调试和纠正他们使用产品的方式。

调整错误可以使用标准 HTTP 代码。对于报错,客户端调用应该有对应的 400 类型的错误代码与之关联;如果存在任何服务器端错误,则必须将对应的 500 响应与它们相关联。使用资源的成功请求方法,应返回 200 类型的响应。

一般而言,使用 API 时会出现三种可能的结果:

*** 客户端应用程序运行错误(客户端错误 – 4xx 响应代码)。**

*** API 行为错误(服务器错误 – 5xx 响应代码)。**

*** 客户端和 API 工作(成功 - 2xx 响应代码)。**

当使用者在使用 API 遇到障碍时,引导他们成功完成,这将大大有助于改善开发人员体验和防止 API 滥用。而很好地描述这些错误响应,需要保持简单和整洁。除了这些,还需要在错误代码中为最终使用者提供足够的信息,才能帮助他们开始修改调整,如果觉得简单描述不够,那可以再提供指向其他文档的链接。

举例说明所有的 GET 响应

一个设计良好的 API 应当有对应的例子,对一个URL获得成功的响应。此示例响应应该简单、明了且易于理解。一个好的经验法则是帮助开发人员在五秒内准确了解成功的响应会给他们带来什么。

回到我们的照片共享应用程序,我们定义了一个 /users 和一个 /photos URL。/users 集合将在数组中提供所有已注册应用程序的用户的用户名和加入日期。

可以使用像 Eolink 这样的 API设计开发工具,在 OpenAPI 规范中定义 API,如下所示:

请注意终端用户可以从成功的 GET 调用中获得的每个响应项中描述的数据类型和示例。终端用户将接收JSON 格式的成功响应如下所示。

如果终端用户使用 GET 方法成功调用终端点,那么用户应获取上述数据以及 200 响应代码来验证此为正确用法。同样,不正确的调用,应反馈对应的 400 或 500 响应代码以及相关信息,以帮助用户更好地对集合进行操作。

| 请求

优雅地处理复杂的问题

尝试公开的数据可以通过许多属性来展示,这些属性可能对使用该 API 的最终消费者有益。这些属性描述了基本资源并隔离了可以使用适当方法操作的特定信息资产。

API 应尽量保证完整度,并提供所有必需的信息、数据和资源,以帮助开发人员以无缝方式与它们集成。

但是,完成度意味着要考虑 API 的常见用例。可能有无数的情景关联和属性,去定义它们中的每一个资源并不是一个好的做法。

还应考虑资源公开的数据量。如果试图加载出来很多数据,可能会对服务器产生负面影响,尤其是在负载和性能方面。

上述情况和关系是 API 设计中的重要考虑因素,可以使用适当的参数进行处理。可以扫描属性并限制查询参数中“?”后面的响应,或者使用路径参数隔离客户端正在使用的数据的特定组件。

让我们以我们的照片共享应用程序为例。

开发人员可以使用它来获取有关在特定位置和特定主题标签共享的所有照片的信息。我们还希望将每个 API 调用的结果数限制为 10,以防止服务器负载。如果最终用户想要在波士顿找到带有 #winter 标签的所有照片,调用将是:

请注意,复杂的问题现在已被简化为与查询参数的简单关联。如果您想根据客户的请求提供有关特定用户的信息,则调用将是:

其中 kesh92 是 users 集合中特定用户的用户名,将返回 kesh92 的位置和加入日期。

以上是一些可以设计参数以实现 API,完成并帮助开发人员直观地使用 API 的一些方法。

最后,如果对特定资源或集合的功能有第二个想法,请将其留待下一次迭代。开发和维护 API 是一个持续的过程,等待合适用户的反馈有助于构建强大的 API,使用户能够以创造性的方式集成和开发应用程序。

图中所使用的的接口管理工具是eolink,感兴趣可以自行使用:www.eolink.com

什么是好的 API 设计?【eolink翻译】的更多相关文章

  1. 关于API:好的设计和坏的设计【eolink翻译】

    以前开发或更新 API 时,我们经常需要深入讨论对 API 的结构.命名和功能等,这个花费了大量的时间. 随着 API 行业的蓬勃发展,API 设计也越来越重要.这么多年发展下来,一些如REST AP ...

  2. 我所理解的RESTful Web API [设计篇]

    <我所理解的RESTful Web API [Web标准篇]>Web服务已经成为了异质系统之间的互联与集成的主要手段,在过去一段不短的时间里,Web服务几乎清一水地采用SOAP来构建.构建 ...

  3. (转)Java API设计清单

    转自: 伯乐在线 Java API设计清单 英文原文 TheAmiableAPI 在设计Java API的时候总是有很多不同的规范和考量.与任何复杂的事物一样,这项工作往往就是在考验我们思考的缜密程度 ...

  4. 优秀API设计的十大原则

    优秀API设计的十大原则 2015-09-23    分类:编程开发.设计模式.首页精华暂无人评论 分享到:更多4 二十万年薪PHP工程师培养计划 成为被疯抢的Android牛人 风中叶讲Java重难 ...

  5. 来自HeroKu的HTTP API 设计指南(中文版)

    原文转自:http://get.jobdeer.com/343.get 来自HeroKu的HTTP API 设计指南(中文版) 翻译 by @Easy 简介 本指南中文翻译者为 @Easy ,他是国内 ...

  6. 【Xamarin挖墙脚系列:Xamarin.Android的API设计准则】

    原文:[Xamarin挖墙脚系列:Xamarin.Android的API设计准则] 前言 楼主也是看着Xamarin的官方文档来的.基本也是照猫画虎.英语勉强凑合.翻译的不对的地方,大家多多指教.(这 ...

  7. 组件接口(API)设计指南-文件夹

    组件接口(API)设计指南-文件夹 组件接口(API)设计指南[1]-要考虑的问题 组件接口(API)设计指南[2]-类接口(class interface) 组件接口(API)设计指南[3]-托付( ...

  8. REST API设计指导——译自Microsoft REST API Guidelines(四)

    前言 前面我们说了,如果API的设计更规范更合理,在很大程度上能够提高联调的效率,降低沟通成本.那么什么是好的API设计?这里我们不得不提到REST API. 关于REST API的书籍很多,但是完整 ...

  9. REST API设计指导——译自Microsoft REST API Guidelines(三)

    前面我们说了,如果API的设计更规范更合理,在很大程度上能够提高联调的效率,降低沟通成本.那么什么是好的API设计?这里我们不得不提到REST API. 关于REST API的书籍很多,但是完整完善实 ...

随机推荐

  1. zabbix 1.1

    1.zabbix监控平台 2.zabbix的三部分组件:      Zabbix server 是 Zabbix软件的核心组件,agent 向其报告可用性.系统完整性信息和统计信息.server也是存 ...

  2. 技术管理进阶——技术Leader如何拒绝业务方?

    原创不易,求分享.求一键三连 前段时间,有个粉丝在群里问了一个问题: 今天对接一个业务团队,要我帮他导数据,这种工作又臭又烦又没成长,而且边界模糊谁做都可以,我很想拒绝他,但又怕引起对方不满,大家有什 ...

  3. @ConfigurationProperties(prefix = "server-options") 抛出 SpringBoot Configuration Annotation Processor not configured 错误

    说明 spring-boot-configuration-processor 包的作用是自动生成 META-INF/spring-configuration-metadata.json 文件,而这个 ...

  4. 嵌入:CAN

    说下我的学习过程.刚到公司的时候我根本不知道什么是CAN,甚至连以太网和串口通讯都不懂.领导把USBCAN分析仪拿给我,把铜线短接上,用软件在CAN1窗口点下发送,CAN2窗口马上接收到了发送出来的数 ...

  5. 832. Flipping an Image - LeetCode

    Question 832. Flipping an Image Solution 题目大意:将1列与最后n列对换,2列与n-1列对换-然后再将每个元素取反 思路:遍历二维数组的左半边,对每个元素先做对 ...

  6. 场景实践:基于 IntelliJ IDEA 插件部署微服务应用

    体验简介 阿里云云起实验室提供相关实验资源,点击前往 本场景指导您把微服务应用部署到 SAE 平台: 登陆 SAE 控制台,基于 jar 包创建应用 基于 IntelliJ IDEA 插件更新 SAE ...

  7. Redis中的原子操作(2)-redis中使用Lua脚本保证命令原子性

    Redis 如何应对并发访问 使用 Lua 脚本 Redis 中如何使用 Lua 脚本 EVAL EVALSHA SCRIPT 命令 SCRIPT LOAD SCRIPT EXISTS SCRIPT ...

  8. GDKOI 2021 Day3 PJ 懵逼记

    今天早了一点起来,初三的大奆都来做比赛了, 自然,自测的有许多 AK 虽然今天的题比昨天简单,但还是脑子还是十分迟钝,以至于贪心都想不出 真为明天的提高组而担忧 T1 斜率被卡 90 ,直接用勾股定理 ...

  9. zigbee技术数传电台在石油探井状态监测系统

    石油探井分布分散,数量众多,出现异常现象需及时处理.人工巡视耗时长.时效性差:有线传输存在布线繁琐.成本高.现场无移动网络覆盖等诸多缺点. 现需要一种支持大量接入.覆盖范围广.数据传输高效且有数据中心 ...

  10. JAVA设计模式总结—建造者模式

    建造者模式 模式动机与定义 ​ 首先建造者模式的动机是为了创建复杂对象,简化传统的创建方法,提高创建的效率和可读性. ​ 像图中的这个例子,用户的需求是驾驶一辆汽车,但是对于用户来说是不需要了解汽车装 ...