如果您不熟悉API(应用程序编程接口),那么在您遇到REST之前不久就会如此,REST是一种便于跨网络的计算机系统之间通信的架构风格。

那么REST最重要的是什么?在本指南中,当我们深入研究万维网背后的基础技术时,我们将回答这些问题和其他问题。

HTTP和万维网

REST是一种体系结构样式,描述了分布式应用程序应如何相互交互。但要真正了解REST是什么,首先需要了解两个概念:

资源,类似于Web的名词 – 它们描述了客户端可能想要从服务器中提取的“事物”(例如,组成网页的文档和文件)。

HTTP谓词,它是Web的动词 – 它们描述了您可以对资源执行的“操作”,例如GET,POST,PUT和DELETE。

在现实世界中,将动词应用于名词是我们人类每天都在做的事情,没有什么麻烦。你可以从咖啡桌上“取出”遥控器,“喝”咖啡,然后“松开”松饼,没有任何混淆。人机界面能够区分在时空约束下我们能做什么和不能做什么。

在万维网上,您需要更具体。需要统一资源标识符(URI)来标识应用程序要访问的资源。需要HTTP(超文本传输​​协议),以便客户端知道可以将哪些“动词”应用于该资源。

在浏览器中键入一种称为URL(统一资源定位符)的特殊类型的URI并按Enter键,它会启动一系列事件,这些事件会导致向服务器发送GET请求,该服务器会响应您想要的网页访问,您现在拥有HTTP和万维网规范的标准实现。

这一切都很好,但REST在哪里?要回答这个问题,请在世纪之交(1999年至2000年)将自己置于普通网络开发人员的角度。您知道如何使用HTTP和WWW规范设计Web应用程序。您的下一个逻辑问题是:设计良好的Web应用程序是什么样的?围绕这些规范设计软件的最佳实践是什么?

REST是什么?

因此,在2000年,HTTP规范的主要作者之一Roy T. Fielding发表了他着名的博士论文。它引入了REST的概念,并作为设计良好的Web应用程序应该是什么样子的第一个正式描述之一:

REST提供了一组体系结构约束,当作为一个整体应用时,强调组件交互的可伸缩性,接口的通用性,组件的独立部署以及中间组件,以减少交互延迟,实施安全性并封装遗留系统。

在接下来的部分中,我们将详细介绍REST API的概念和约束。

关注点分离:客户端和服务器

所有RESTful应用程序必须尊重客户端和服务器之间的关注点分离。这意味着客户端和服务器可以完全互操作。只要客户端和服务器都同意数据格式(通常是JSON)和消息传递协议(HTTP),就可以在不影响服务器操作的情况下更改客户端的代码,并且可以在不影响服务器端的代码的情况下更改代码客户端。

这种模块化使RESTful应用程序更加灵活,更易于扩展。可以采用面向组件的开发方法,只要它们访问正确的REST端点,不同的客户端和服务器就可以相互交互。

无国籍

RESTful应用程序是无状态的。客户端不需要知道服务器处于什么状态,反之亦然。这意味着服务器和客户端可以相互理解而无需查看以前的消息。

这种约束背后的想法是,从客户端到服务器的每个请求都应该包含服务器理解请求所需的所有上下文,而不依赖于存储在服务器上的任何上下文。换句话说,会话状态完全保留在客户端上。

无国籍约束有明确的权衡。您可以通过重复数据传输的形式增加每次交互的网络开销,从而获得可见性,可靠性和可扩展性。幸运的是,有一个解决方案:缓存。

可缓存

为了补偿无状态约束对客户端 – 服务器交互所带来的网络效率,RESTful服务必须支持缓存,即能够沿请求路径存储频繁访问的数据的副本。

高速缓存约束要求将对请求的响应中的数据标记为可高速缓存或不可高速缓存。可缓存的响应打开了消除整个响应树的可能性。

当发出请求时,首先检查高速缓存或一系列高速缓存以查找频繁访问的数据。仅当网络请求无法在任何缓存中找到它正在查找的数据时,网络请求才会传送到服务器。

缓存可减少服务器上的带宽,延迟和总体负载。它还可以屏蔽用户的网络故障,因为他们仍然可以查看存储在缓存中的网页。这就是您的ISP将缓存数据存储在其服务器上的浏览习惯上的原因。

分层系统

REST通过支持分层系统进一步分离了关注点。这是一种体系结构样式,涉及将行为封装到遵循系统层次结构的组件层中。

例如,您可能有三个服务器,X,Y和Z.API部署在服务器X上,数据存储在服务器Y上,身份验证在服务器Z上处理。但是,就最终用户而言,他或她只是发送请求(例如,点击链接)并接收响应(指向新网页)。

分层系统可以与请求路径上的共享中介处的高速缓存配对,通过跨多个网络和处理器的服务负载平衡来提高网络性能。

统一界面

RESTful应用程序的核心和灵魂是组件之间统一接口的想法。REST由四个接口约束定义:

请求中的资源标识,可以命名的任何信息都是资源,可以通过URI识别资源,这与资源类型无关。

通过表示来处理资源。这些资源的表示不是直接操纵资源,而是在整个系统中传递。HTML,XML,SVG,JSON和PNG是资源表示格式的示例。

自我描述性的信息,每个客户端请求和服务器响应都包含作用于资源所需的所有上下文。

基本上,每个响应都通过为每个响应中的允许操作提供URI来描述API的使用方式。有点争议的是,许多自称为RESTful的API都跳过了这个要求。但要真正的RESTful原始论文,HATEOAS是一个艰难的要求。

总而言之,组件之间有一个统一的接口,可以将实现与它们提供的服务分离,并鼓励独立的发展。换句话说,您实现了分布式网络中的应用程序之间的互操作性 – RESTful API。