深入理解REST API:架构原理与实际应用

本文全面介绍REST API的基本概念、核心组件、工作原理、实际应用场景和最佳实践。详细解析了RESTful架构的六大原则,包括统一接口、无状态操作、缓存机制等关键技术特性。

什么是REST API?优势、用途与实例

概述

REST API是一种应用程序编程接口的架构风格,它使用超文本传输协议(HTTP)请求来访问和使用数据。这些数据可用于GET、PUT、POST和DELETE数据类型,分别对应资源的读取、更新、创建和删除操作。

API是使两个软件程序能够相互通信的代码。API的设计规定了开发人员编写程序(即客户端)的正确方式,以使用API向另一个应用程序(即服务器)请求服务。API是软件互操作性的重要机制。

REST API也被称为RESTful Web服务和RESTful API。它们基于表述性状态传递(REpresentational State Transfer),这是一种常用于Web服务开发的架构风格和通信方法。这种方法还可以促进其他应用程序类型之间的通信。

与类似技术相比,REST技术通常更受青睐,因为它使用更少的带宽,使其在互联网使用中更加高效。REST API还可以使用常见的编程语言(如PHP、JavaScript和Python)构建。

REST浏览器被认为是互联网的语言。云消费者使用API来公开和组织对Web服务的访问。对于构建API以提供用户在分布式环境中灵活连接、管理和交互云服务的方式,REST是一个合乎逻辑的选择。诸如Amazon、Google、LinkedIn和Twitter等网站都使用REST API。

REST API的主要元素和工作原理

REST API基本依赖于以下三个主要元素:

  • 客户端:客户端是从服务器请求资源的软件代码或应用程序
  • 服务器:服务器是控制资源并响应客户端资源请求的软件代码或应用程序
  • 资源:资源是服务器控制并在响应客户端请求时提供的任何数据或内容,如文本、视频和图像

要访问资源,客户端向服务器发送HTTP请求。客户端请求包括以下四个主要部分:

  • HTTP方法:显示应对指定资源执行什么操作。四种基本的HTTP方法称为动词。POST创建新资源,GET检索现有资源,PUT更新或更改现有资源,DELETE删除资源。如下表所示,这些HTTP动词对应于创建、检索、更新和删除方法或操作,称为CRUD
  • 端点:端点显示资源的位置,通常包括统一资源标识符(URI)。如果通过互联网访问资源,URI可以是提供资源Web地址的URL
  • 头部:头部包括执行调用和处理响应所需的详细信息。请求头部可能包括身份验证数据、加密密钥、有关服务器位置的更多详细信息或访问信息,以及响应所需数据格式的详细信息
  • 主体:主体包含与服务器之间相关的信息。例如,主体可能包含要通过POST或PUT方法添加到服务器的新数据
HTTP动词 CRUD操作
POST 创建
GET 读取
PUT 更新
PATCH 更新
DELETE 删除

托管API的服务器端处理调用并形成响应。当请求数据时,服务器发送请求数据的机器可读表示,然后客户端处理这些数据。通常,响应详细信息包括解释响应所需的任何信息,例如数据是XML、JSON还是纯文本格式。服务器提供额外数据,如错误代码和时间戳,或客户端的其他指令。

简而言之,调用和响应是自描述的。这意味着它们将包括如何处理和解释它们的信息。

REST API将事务分解为一系列小模块。每个模块处理事务的基础部分。这种模块化给开发人员带来了灵活性,但从头设计REST API可能具有挑战性。多个组织和倡议为开发人员提供了使用的模型,包括Amazon Simple Storage Service、存储网络行业协会的Cloud Data Management Interface和OpenStack基金会的OpenStack Swift。

REST API使用命令获取资源。资源在任何给定时间戳的状态称为资源表示。REST API使用RFC 2616协议定义的现有HTTP方法,如GET、PUT、POST和DELETE。

使用REST,网络化组件是用户请求访问的资源。这就像一个实现细节不清晰的黑盒。所有调用都是无状态的;REST服务不能在执行之间保留任何内容。

REST API支持的数据格式包括application/json、application/xml、application/x-web+xml、application/x-www-form-urlencoded和multipart/form-data。

REST API的实例

由于调用是无状态的,REST在云应用程序中非常有用。无状态组件可以自由重新部署、重新发送或在失败时重试,并且它们提供显著的可扩展性以适应工作负载变化。

这种方法有效,因为任何请求都可以定向到组件的任何实例。下一个事务中不需要记住任何内容,这使得使用REST API对于Web应用程序更可取。

RESTful模型在云服务中很有用,因为通过API绑定服务就是控制URL解码方式的问题。云计算和微服务几乎肯定会使RESTful API设计成为未来的规则。

REST API经常用于移动和基于Web的应用程序,以访问和更改远程系统上的数据。有无数用例,但以下是一些最受欢迎的:

  • 移动性:Lyft和Uber等移动应用程序使用REST API访问地图和安排乘车
  • Google Maps和其他地理位置应用:REST API检索地图数据以提供位置、距离和方向
  • 天气:REST API常用于天气应用,提供当前天气状况、预报和历史数据
  • 银行和电子商务:这些应用使用REST API访问账户数据和支持交易
  • 流媒体服务:Spotify、Netflix和其他流媒体服务使用REST API从远程服务器访问媒体
  • 社交媒体:X和Facebook等服务使用REST API创建和管理帖子,以及与其他应用程序集成

REST API架构风格的原则:什么使服务成为RESTful?

要使服务被视为真正的RESTful Web API,必须根据以下客户端-服务器架构原则设计和实现:

  • 接口必须统一:这是最重要的。所有REST API必须一致,在其URI中提供资源标识。它们必须使用标准HTTP方法——CRUD操作(GET/POST/PUT、PATCH/DELETE)——并以多种格式(如XML和JSON)表示资源
  • 客户端-服务器分离:通信的前端(客户端)和后端(服务器)必须彼此独立;服务器必须提供资源,而客户端托管UI
  • 多层:虽然不需要,但架构允许多层,包括代理、负载均衡器和身份验证;客户端不关心它是否实际与Web服务器通信
  • 必须无状态:每个API调用都是独立的,意味着服务器不跟踪客户端在请求之间的状态
  • 缓存:响应使用HTTP头部确定是否可缓存;这减少了延迟并提高了性能
  • 代码返回:虽然不需要,但架构使服务器能够在有用时向客户端返回可执行代码,如JavaScript

REST API的优势

REST API由于为开发人员和组织提供的众多优势而获得了巨大普及,包括:

  • 简单性:REST API使用常见的HTTP方法,包括GET、PUT、POST和DELETE请求,使其易于设计、实现和使用
  • 独立性:开发人员享受平台独立性,因为他们可以使用几乎任何编程语言创建REST API。它们与各种客户端设备配合使用,如传统Web浏览器、移动设备和物联网设备
  • 灵活性:REST API支持许多不同的数据格式,包括JSON、XML和纯文本。开发人员可以选择最适合其客户端需求和可用服务器端数据的数据格式
  • 可扩展性:REST API的无状态性质支持水平扩展,其中许多API调用并行运行以处理显著的API调用负载
  • 可缓存性:REST API支持缓存,允许数据存储在本地内存中。这种方法可以加快服务器端响应时间,可能提高API性能。如果所需数据已从先前调用在客户端上,它甚至可能消除API调用的需要
  • 安全性:REST API可以使用开放授权(OAuth)身份验证和安全套接字层/传输层安全加密来保护调用和数据交换
  • 兼容性:正确使用版本控制使开发人员能够像对待任何其他发展中的软件一样对待API,随时间添加新功能并具有向后兼容性,并为现有客户端支持传统功能

RESTful API设计和架构约束与挑战

Adobe高级首席科学家Roy T. Fielding博士在其2000年的博士论文中将RESTful API设计定义为遵守以下六个REST架构约束的Web服务:

  • 统一接口:资源应通过单个URL唯一标识。操作资源应仅使用网络协议方法DELETE、PUT和GET与HTTP进行
  • 基于客户端-服务器:客户端和服务器之间的划分应清晰。客户端的领域是UI和请求收集关注点,而服务器的领域是数据访问、工作负载管理和安全性。客户端和服务器的这种松散耦合使每个都能独立于另一个进行开发和增强
  • 无状态操作:所有客户端-服务器操作必须是无状态的。任何所需的状态管理应在客户端进行,而不是在服务器上
  • RESTful资源缓存:除非不可能,否则所有资源应允许缓存
  • 分层系统:REST支持由多个服务器层组成的架构
  • 按需代码:通常,服务器将以XML或JSON的形式发送资源的静态表示。但是,在必要时,服务器可以向客户端发送可执行代码

REST API不是万能药。一些可能具有挑战性的概念包括:

  • 端点一致性:为保持一致,端点路径应遵循常见的Web标准,这可能难以管理
  • API版本控制:在内部或与其他应用程序使用时,端点URL不应失效
  • 长响应时间和过多数据:返回的资源量可能随时间增长,增加负载和响应时间
  • 导航路径和用户输入位置:由于REST对输入参数使用URL路径,确定URL空间可能具有挑战性
  • 安全性:有许多安全问题需要管理,如使用HTTPS、阻止来自未知IP地址和域的访问、验证URL、阻止意外大的有效负载、监视和记录请求以及调查失败
  • 身份验证:这需要了解和使用常见的身份验证方法,如HTTP基本身份验证(允许base64编码的用户名和密码字符串)、API密钥、JSON Web令牌和其他访问令牌,如OAuth 2.0(适用于访问控制)
  • 请求和数据:某些请求可能包含比需要更多的数据和元数据,或者可能需要更多请求来获取所有数据。可以为此调整API
  • 错误代码和消息:常见做法是使用标准HTTP错误代码。错误处理可能无法区分响应是否成功,除了解析主体或检查错误
  • API测试:这可能是一个设置和运行的长过程,每个部分都可能具有挑战性。测试也可以使用客户端URL(cURL)实用程序在命令行上进行。测试相关挑战包括初始设置、模式更新、测试参数组合、API调用排序、测试参数验证和系统集成

REST API最佳实践

REST API是专用于支持网络通信和执行特定任务的软件应用程序。API开发和管理通常采用应用于任何其他软件项目的相同原则和指南。但是,以下常见REST API最佳实践可以改进API设计和实现:

  • 在端点路径中使用名词:当REST API已经在请求形成中使用动词(如GET或PUT)时,被访问的资源应使用名词指定,如GET/datasource或POST/articles。这使得请求形成对设计者更直观
  • 使用完善的数据格式:JSON是REST API有效负载的最常见和最流行的数据格式,也是流行编程语言(如JavaScript)的默认格式
  • 采用优雅的错误处理:确保在REST API响应中包含完整的错误处理,并使用标准HTTP响应代码指示错误类型。这有助于确保错误不会使客户端应用程序或服务器崩溃,并且可以快速理解和纠正
  • 限制数据集:使用过滤、排序和其他数据访问技术来限制或减少可以返回给客户端的数据量。尝试传输巨大的数据集可能会损害或使API崩溃。设计API以仅请求和发送请求的最小数据
  • 维护安全性:设计REST API以使用身份验证和加密作为标准实践。即使对使用自由可用数据的公共API,也应应用全面的安全性
  • 尽可能使用缓存:REST API支持服务器端和客户端缓存。在服务器端使用缓存可在频繁请求到达时加快服务器的响应时间。在客户端使用缓存意味着数据已在客户端上,不需要进行API调用。在这两种情况下,API性能都会提高

REST与SOAP

REST和简单对象访问协议(SOAP)提供了调用Web服务的不同方法。REST是一种架构风格,而SOAP定义了基于XML的消息交换的标准通信协议规范。REST应用程序可以使用SOAP。

RESTful Web服务是无状态的。与SOAP相比,基于REST的实现很简单。但是,用户必须理解传递的上下文和内容。没有描述REST Web服务接口的标准规则集。REST服务对于受限配置文件设备(如移动设备)很有用,并且易于与现有网站集成。

SOAP需要比REST服务设计更少的管道代码(连接主代码模块的低级基础设施代码)。Web服务描述语言(WSDL)描述了定义服务的消息、绑定、操作和位置的通用规则集。SOAP Web服务对于异步处理和调用很有用。SOAP中发现的结构化形式性通常更适合可能压倒类似REST API设计的复杂企业级软件集成和工作流。

REST和SOAP都是构建API的有用和有效方法。在它们之间选择取决于API的预期目的和特性。

RESTful API的历史

在REST之前,开发人员使用SOAP集成API。要进行调用,开发人员手动编写包含远程过程调用的XML文档。然后他们指定端点,并将SOAP信封POST到端点。

2000年,Fielding博士和一组开发人员决定创建一个标准,以便任何服务器都可以与其他服务器通信。他定义了REST,它具有通用规则,使开发人员更容易集成软件。

Salesforce是2000年第一家将RESTful API作为其互联网即服务包一部分销售的公司。然而,很少有开发人员能够使用复杂的XML API。然后eBay构建了一个REST API,将其市场扩展到任何可以访问其API的网站。这引起了另一家电子商务巨头的注意,Amazon在2002年宣布了其API。

Flickr于2004年8月推出了其RESTful API,让博主可以轻松地在他们的网站和社交媒体源中嵌入图像。Facebook和Twitter都在2006年发布了他们的API,屈服于开发人员的压力,这些开发人员抓取网站并创建了弗兰肯斯坦API。当AWS在2006年帮助推出云时,开发人员可以使用其REST API在几分钟内访问数据空间。对公共API的请求迅速升级。

从那时起,开发人员就接受了REST API,使用它们为其网站和应用程序添加功能。今天,它们被认为是互联网的支柱。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计