一种软件体系结构风格,并不是一个具体的实现,属于高级抽象,在应用普及方面先天不足。
REST涉及资源、表征和状态3个概念。资源是任何事物,它可以是一个实物,也可以是一个抽象的概念。只要有被引用的必要,就可以将其抽象为一个资源。通常一个资源是某个可以存放在计算机上的事物,表征是一个资源当前状态的有用信息。对于给定的资源,可以有多个不同的表征。REST中的状态分为资源状态和应用状态,资源状态是关于资源的信息,保存在服务端;应用状态是客户端在应用中所处状态的信息,由各个客户端自己维护。
满足REST体系结构风格的约束主要有:①从空风格开始。从体系结构的观点来看,空风格表示构成系统的组件之间没有明显的边界,这就是描述REST的起点。②用户-服务器。用户-服务器约束背后的原则是分离关注点。通过分离用户接口和数据存储这两个关注点,改善用户接口跨多个平台的可移植性;同时通过简化服务器组件,改善系统的可伸缩性。③无状态。这个约束导致了可见性、可靠性和可伸缩性3个体系结构属性,但是无状态并不是没有缺点的,无状态增加了在一系列请求中发送的重复数据(每次交互的开销),可能会降低网络性能,正因为这个缺点,所以在REST风格中增加了缓存的考虑。④缓存。添加缓存约束的优势在于,它们有可能部分或全部消除一些交互,从而通过减少一系列交互的平均延迟时间,来提高效率、可伸缩性和用户可觉察的性能。但是缓存还是有缺点的,如果缓存中陈旧的数据与将请求直接发送到服务器得到的数据差别很大,那么缓存会降低可靠性。⑤统一接口。使REST体系结构风格区别于其他基于网络的体系结构风格的核心特征是,它强调组件之间要有一个统一的接口,为了获得统一的接口,需要有多个体系结构约束来指导组件的行为。REST由4个接口约束来定义,即资源的识别、通过表述对资源执行的操作、自描述的消息以及作为应用状态引擎的超媒体相关因素REST和其他概念关系。⑥分层系统。分层系统风格通过限制组件的行为(即每个组件只能“看到”与其交互的紧邻层),将体系结构分解为若干等级的层。通过将组件对系统的知识限制在单一层内,为整个系统的复杂性设置了边界,并且提高了底层独立性。分层系统增加了数据处理的开销和延迟,因此降低了用户可觉察的性能对于一个支持缓存约束的基于网络的系统来说,可以通过在中间层使用共享缓存所获得的好处来弥补这一缺点。正因为REST风格有这样的缺点,才会特意强调缓存的作用。⑦按需代码。通过下载并执行小应用程序形式或脚本形式的代码,REST允许对客户端的功能进行扩展。
万维网服务实现方案的3种主流形式分别是REST、简单对象访问协议(simple object access protocol,SOAP)、可扩展标记语言-远程过程调用(extensible markup language-remote procedure call,XML-RPC),而XML-RPC逐渐被SOAP所取代。在安全性方面,SOAP的安全性高于REST,而在效率和性能方面,REST更为突出。总体上,由于REST模式的万维网服务与复杂的SOAP和XML-RPC对比来讲明显地更加简洁,越来越多的万维网服务开始采用REST风格设计和实现。例如,亚马逊提供接近REST风格的万维网服务进行图书查找;雅虎提供的万维网服务也是REST风格的。REST对于资源型服务接口来说很合适,同时特别适合对于效率要求很高,但是对于安全要求不高的场景。而SOAP的成熟性可以给需要提供多开发语言的,对于安全性要求较高的接口设计带来便利。