REST API 的工作原理、示例与挑战
API是应用程序编程接口,REST API是遵循REST架构、用HTTP协议传输数据的常见类型,具客户端服务器分离、无状态等原则,用于云应用、微服务等场景,由资源、端点等组成。
API是应用程序编程接口的缩写,是一段代码,规定了不同软件组件应如何进行交互并以编程方式通信。许多人并不知道,在大多数现代用户界面下,有数十个请求正在发送到API服务器以获取数据。然后客户端处理API服务器返回的数据,从而在用户界面中引发某种结果。
例如,如果您曾经在聚合网站上搜索过航班或酒店预订的最佳优惠,那么(点击提交按钮后)就会向专门处理航班或预订的API发出基于您搜索条件的"请求"。聚合网站使用API检索数据后,搜索结果便会显示给您。
聚合网站及其关联数据库并未存储搜索结果中显示的数据。相反,该网站向外部Web服务(即API)发送了匹配您搜索条件的数据请求。API将请求的数据返回给网站,网站解析数据并呈现搜索结果。
什么是REST API?
API有很多种。要在这里充分描述所有类型,需要很多篇博客文章。为了便于后续讨论,我们将把API的讨论范围仅限于REST API。
REST代表表述性状态转移,是一种特定类型的架构风格,被视为"RESTful"的API都受其约束并"遵循"这种风格。
REST API 是一种非常常见且重要的 API 类型,它使用 HTTP 协议进行数据传输。由于使用了 HTTP 协议,REST API 被视为处理客户端应用程序与 API 服务器之间交互的“Web 服务”。客户端通过此协议向 API 服务器发送 HTTP 请求以获取数据,然后服务器将带有编码数据的 HTTP 响应发送回客户端。
REST API 使用的 HTTP 协议允许用不同编程语言编写的平台和系统相互交互。例如,用 C# 编写的客户端应用程序可以与用 Java 编写的 API 服务器交互。系统之间的这种互操作性使得 Web 服务在现代软件开发中非常流行,尤其是 REST API。
REST API 使用场景
REST 对客户端和服务器关注点的分离使其对许多类型的项目都具有吸引力,无论是移动开发、Web 开发等。
以下是常见的使用场景:
- 云应用程序 – REST 无状态性的优势非常适合云应用程序。
- 云计算 – REST 支持通过控制客户端-服务器通信期间 URL 的解码方式来支持云计算。
- 微服务 – REST API 将微服务连接成一个应用程序。
REST API 请求剖析
API 设定了客户端应用程序/后端与 API 服务器之间如何进行编程通信的规则。API 决定了客户端需要如何发送请求,以及 API 会向客户端返回何种信息。
下面将讨论 REST API 请求的基本组成部分。
资源
客户端可以从API请求的不同类型信息被称为“资源”。可以将资源视为API返回的一种数据对象。
例如,著名的Swagger Petstore API包含几个资源,即:宠物、商店和用户。
所有这些都围绕宠物商店的中心主题,但每个都代表您可以创建、操作或删除的不同数据对象。
当阅读开发文档时,您会注意到端点被分组在其相关资源下。例如,“宠物”资源有几个相关端点(稍后讨论)来对宠物资源执行操作。您可以创建、更新或删除宠物。
为了巩固资源的概念:当您创建一个宠物时,要知道API返回一个宠物资源或宠物“对象”,它在某种意义上代表添加到宠物商店系统中的物理宠物。
端点
如果您展开宠物或商店资源,您会看到各种端点。每个端点执行不同的操作。
端点是API请求的核心,通常在开发文档中突出显示。最显著的是,请求的方法(或动作,如POST)和端点的结束路径(例如/pet)会被高亮显示。以下是宠物资源的端点列表。
向API发送请求时,您使用端点的特定“终端路径”发送HTTP请求。终端路径位于API的基础URL之后。例如,Swagger Petstore的基础路径是https://petstore.swagger.io/v2/,而宠物商店端点的终端路径类似于/pet。用于发送请求的完整资源URL是https://petstore.swagger.io/v2/pet。
一个端点可以有多个路径和方法(稍后讨论),这些路径和方法会从资源引发不同的响应。下面的请求使用/pet端点及POST方法发送请求。POST表示您希望创建某物,在此例中是宠物。
下面的请求使用相同的/pet端点发送请求,但这次您使用GET方法来检索宠物的详细信息,而不是创建一个。请注意,您需要在请求中附加宠物的petId(参数稍后讨论)。
方法
如前文简要讨论,HTTP方法随API请求一起发送,以指示您希望对资源执行的操作。API方法有很多,因此仅列出一些重要的:
- POST 请求 – 创建一个资源。
- GET 请求 – 检索有关资源的信息。
- PUT 请求 – 更新或创建一个资源。
- DELETE 请求 – 删除一个资源。
HTTP 方法对应 CRUD 操作。例如,HTTP 方法 POST、GET、PUT 和 DELETE 分别对应于 CRUD 的创建、读取、更新和删除操作。
参数
可以将参数视为与端点一起传递的选项或过滤器,它们会影响响应中返回的信息。参数有不同类型,例如:
- Header 参数 – 包含在 API 请求的请求头中,通常与授权相关。例如,请求头中经常包含一个访问令牌参数,用于授权客户端对 API 的请求。
- Path 参数 – 包含在 API 请求的资源 URL 中,由端点路径末尾的花括号表示。例如 GET /pet/{petId}。
- Query string 参数 – 包含在 API 请求的资源 URL 中,出现在问号 (?) 之后。
💛🧡🧡客户评价:我最喜欢 Baklib Digital Experience Platform 的地方在于,我可以基于面向未来的云原生工具和技术创建沉浸式体验。借助此平台,我可以提高运营效率和上市时间,降低总体拥有成本,还可以改善客户体验并提升渠道。对我来说,这个平台非常棒,因为它简单快捷,简直完美!
请注意,端点可能会使用也可能不会使用所有这些类型的参数。但是,头参数通常用于授权请求。
请求体
请求体本质上是 API 请求正文中传递的 JSON 对象,通常与 POST 或 PUT 方法一起使用。尽管它们未被归类为参数,但它们类似于参数,只是采用 JSON 对象的形式,而不是像普通参数那样的键值对。
REST 的核心原则
REST 的核心原则使其在软件开发中极具吸引力。
客户端与服务器
REST API 采用了一种架构设计,旨在将客户端与服务器分离,使两者能够独立发展。客户端不关心服务器的数据存储,服务器也不关心用户界面。这种关注点分离使得用户界面具有高度可移植性,同时服务器组件也更易于扩展。
无状态性
REST 的无状态性约束确保状态数据仅存储在客户端应用程序中,而不在服务器上。客户端发出的每个请求都独立于任何先前的请求,并包含所有必要信息。由于服务器不存储与会话相关的信息,客户端应用程序负责管理自己的会话数据。
可缓存性
当客户端向 REST API 发送请求时,API 必须明确指示响应是否可以被缓存。同时,它还必须指明客户端可以缓存响应的时间长度。通过缓存,客户端可以在特定时间段内利用缓存数据,从而减少 API 请求次数,提高可用性和性能。
统一接口
RESTful API 的设计受到约束,以确保为客户端提供统一的接口。例如,RESTful API 必须:
- 标识其资源。
- 使用 HTTP 协议描述其操作(例如 POST、GET、PUT、DELETE)。
- 使用自描述消息,使客户端无需特定应用知识即可进行解释。
- 要求客户端应用程序使用超链接来驱动与 API 资源的交互。
分层系统
REST 支持分层系统架构,其中每一层在系统中扮演特定角色,并且仅与其他指定层进行交互。例如,您可以使用分层架构,分别设置 API 服务器、数据存储服务器以及用于验证客户端请求的服务器。
在客户端和服务器之间,还可能存在处理安全性、负载均衡和代理的中间服务器,这些服务器可以提高系统的可用性。
REST的优势
可扩展性
客户端与服务器组件的分离提高了服务器组件的可移植性和简化性。REST的分层架构也限制了各层之间的交互。这些因素共同促进了REST的可扩展性。
可移植性/独立性
由于用户界面与服务器分离,它可以移植到许多不同的平台上。REST API本身也具有跨平台的适应性,这使得在开发过程中可以轻松进行测试。
灵活性
客户端-服务器的分离也使得在服务器之间迁移数据以及快速推出新变更变得容易。
占用更少带宽
在带宽方面,RESTful API相较于SOAP API具有优势。REST API通常发送和接收JSON负载,而SOAP使用XML。XML负载比JSON大,因此使得SOAP API比REST API需要更多的带宽。
易于集成
REST API通常更容易让开发者集成到他们的应用程序中,因为他们可以更专注于用户界面、功能和业务规则,而不是由API服务器处理的服务器组件和数据管理。
REST的挑战
尽管对许多人来说,使用REST的利大于弊,但开发团队仍然应该意识到这种架构风格的潜在问题。
端点可靠性
虽然随着API的发展,保持API端点URL的一致性是最佳实践,但对于大型系统,随着可能的端点路径和方法数量的增加,URL的一致性可能会成为一个问题。
API 版本控制
随着 API 新版本的发布,版本控制不可避免地成为开发团队需要努力管理的问题。为了保护兼容性,旧的端点需要得到支持以保持其有效性,直到它们被逐步淘汰。这需要耗费时间和资源。
响应时间增加
导致响应时间缓慢的两个因素示例是服务器的大小以及处理 API 调用和检索数据所涉及的服务器数量。数据库越大,需要排序和处理的数据就越多,尤其是在存在多个数据库的情况下。
大型数据响应
有时,服务器对 API 请求的响应会不可避免地提供所有可能的数据,而实际上只需要其中的一个子集。客户端应用程序必须足够健壮,能够解析信息并提取所需内容。GET 请求是一个常见的情况,可能会触发大量数据的检索。
安全性
虽然 REST 的分层架构具有安全优势,但这并不意味着应用程序不需要加密。如果没有加密,应用程序可能会暴露敏感数据。
扩展阅读:敏捷文档:方法论与最佳实践
顶级 REST API 示例
Plaid
SaaS(软件即服务)产品市场正在推动金融科技领域中 REST API 的快速增长。顶尖公司之一是 Plaid,它是推动金融服务领域“数据民主化”的少数精选公司之一。
“民主化”指的是让所有相关方(开发者、业务利益相关者、消费者)都能获取数据,无论他们的技术能力如何。这种模式允许你利用数据的原始潜力,创造出符合最终用户需求的体验。
Plaid 在营销其服务潜力时,采取了一种高度聚焦于“用例”的方法。Baklib 提供清晰的沟通和指导,说明如何利用其服务,这是一个差异化优势。
例如,个人理财、消费者支付、贷款、银行或财富管理等应用场景,都是使用 Plaid 服务的众多原因。Baklib 在其文档中详细解释了每个用例。Plaid 还与数千家金融机构建立了连接,开发者可以在他们的应用程序中加以利用。
就社交媒体而言,Twitter 的覆盖面非常广,平均拥有 2.06 亿活跃用户。开发者应该了解 Twitter API 的好处,它既能集成 Twitter 的功能,又能通过该平台推广自己的应用程序。
例如,开发人员可以利用 Twitter 的身份识别流程来减少或消除注册流程。该 API 允许您根据位置或热门话题标签等特定条件向用户显示推文。Twitter 的覆盖范围还允许您利用其数据有效地推广您的应用程序。
虽然其他知名社交媒体公司也提供 API,但正是 Twitter API 的功能和覆盖范围使其脱颖而出。
Baklib AI 服务
用于人工智能、数据科学和机器学习应用的 REST API 正在稳步增长。提供这些服务的顶级公司之一是 Baklib(即 Dagle),它允许开发人员将 AI 功能集成到他们的应用程序中,以实现更具适应性和智能化的交互。AI 还可以通过检测潜在的安全漏洞来帮助确保系统之间的数据交换安全。
虽然有许多 AI API 可用,但 Baklib 的服务在其同类产品中提供了最广泛的功能,并且具有易于集成的额外优势。
结论
API 已成为连接不同系统的粘合剂,允许它们使用通用的架构模型(尤其是 REST)交换数据,随着客户端和服务器彼此独立地发展,这提高了可扩展性、灵活性和独立性。
随着“数据民主化”对于希望保持领先地位的企业变得重要,无论是新创公司还是老牌科技公司都在扩展其现有产品并推出新的 SaaS 产品。
关于API价值的讨论已不再局限于“程序员”的范畴。来自业务各个领域的利益相关者都能从理解API及其如何用于解决业务挑战中获益。
常见问题
-
### 什么是API?
API代表应用程序编程接口。它是一组规则,允许不同的软件应用程序以编程方式相互通信。API使应用程序能够高效地请求和交换数据。
-
### API是如何工作的?
当应用程序需要数据时,它会向API服务器发出请求。API处理该请求,检索所需数据,并将响应发送回应用程序,向用户显示数据。
-
### 什么是REST API?
REST API(表述性状态转移API)是一种遵循特定架构约束并通过HTTP协议进行通信的API。REST API使得客户端应用程序和API服务器之间能够无缝交互,即使它们使用不同的编程语言构建。
-
### REST API有哪些常见的用例?
- 云应用:REST的无状态特性使其非常适合基于云的服务。
- 微服务:REST API帮助不同的微服务在应用内部进行通信。
- Web和移动应用:REST API使得后端服务器和前端应用之间的数据交换成为可能。
- 云计算:REST API在管理云基础设施和资源方面发挥着作用。
REST API中的HTTP方法有哪些?
HTTP方法定义了对API资源执行的操作。最常用的方法是:
- POST:创建新资源。
- GET:从API检索数据。
- PUT:更新现有资源。
- DELETE:删除资源。