REST架构风格的一些基本概念[转]
?
REST?是从几种基于网络的架构风格(列举在下面)中衍生出来的一种混合架构风格,并且添加了一些额外的约束,用来定义统一的连接器接口。
?
1客户-服务器(CS)2无状态(S)3缓存($)4统一接口(U)5分层系统(LS)6按需代码(COD)?
?
(一)REST中的数据元素(Data Elements)
?
REST对于信息的核心抽象是资源。任何能够被命名的信息都能够作为一个资源换句话说,任何可能作为一个创作者的超文本引用的目标的概念都必须符合资源的定义。一个资源是到一组实体的概念上的映射,而不是在任何特定时刻与该映射相关联的实体本身?
REST使用一个资源标识符来标识组件之间交互所涉及到的特定资源。REST连接器提供了访问和操作资源的值集合的一个通用的接口,而无须关心其隶属函数是如何定义的,或者处理请求的软件是何种类型。由命名权威(namingauthority)来为资源分配资源标识符,使得引用资源成为可能。由同样的命名权威来负责维护映射的语义有效性(例如,确保隶属函数不会改变).
因为集中式的链接服务器无法满足Web的超大规模和多个组织领域的需求,所以REST采用了其他的方式——依赖资源的创作者来选择最符合被标识的概念本质的资源标识符。
??? REST组件通过以下方式在一个资源上执行动作:使用一个表述来捕获资源的当前的或预期的状态、在组件之间传递该表述。一个表述是一个字节序列,以及描述这些字节的表述元数据。表述的其他常用但不够精确的名称包括:文档、文件、HTTP消息实体、实例或变量。
???表述由数据、描述数据的元数据、以及(有时候存在的)描述元数据的元数据组成(通常用来验证消息的完整性)。元数据以名称-值对的形式出现,其中的名称对应于一个定义值的结构和语义的标准。响应消息可以同时包括表述元数据和资源元数据(关于资源的信息,并不特定于所提供的表述)。
???控制数据定义了组件之间的消息的用途,例如被请求的动作或响应的含义。它也被用来提供请求的参数,以及覆盖某些连接元素(connecting?elements)的默认行为。例如,可以使用包括在请求或响应消息中的控制数据来修改缓存的行为。
???如果一个资源在特定时刻的值集合由多个表述组成,可以使用内容协商来选择将包括在一个特定消息中的最佳表述。
???表述的数据格式被称为一种媒体类型。一个表述能够被包括在一个消息中,并由接收者根据消息的控制数据和媒体类型的性质来做处理。媒体类型有些是用来做自动处理的,有些是用来呈现给用户来查看的,还有少数是可以同时用于两种用途的。组合的媒体类型能够被用来将多个表述封装在单个消息之中。
?
(二)REST中的连接器(Connectors)
?
连接器代表了一个组件通信的抽象接口,通过提供清晰的关注点分离、并且隐藏资源的底层实现和通信机制,从而改善了架构的简单性。
所有的REST交互都是无状态的。也就是说,无论之前有任何其他请求,每个请求都包含了连接器理解该请求所必需的全部信息。这个约束能够实现四个功能:1)它使得连接器无需保存请求之间的应用状态,从而降低了物理资源的消耗并改善了可伸缩性;2)它允许对交互进行并行处理,处理机制无需理解交互的语义;3)它允许中间组件孤立地查看并理解一个请求,当需要对服务作出动态安排时,这是必需要满足的;4)它强制每个请求都必须包含可能会影响到一个已缓存响应的可重用性的所有信息。
主要的连接器类型是客户端和服务器。两者之间的本质区别是:客户端通过发送请求来发起通信;服务器侦听连接并对请求作出响应,以便为其服务提供访问的途径。一个组件可能包括客户端和服务器两种连接器。
第三种连接器类型是缓存连接器,可以位于客户端或服务器连接器的接口处,以便保存当前交互的可缓存的响应,这样它们就能够被以后的请求交互来重用。客户端可以使用缓存来避免重复的网络通信,服务器可以使用缓存来避免重复执行生成响应的处理,这两种情况都可以减小交互的延迟。一个缓存通常在使用它的连接器的地址空间内实现。
一个解析器负责将部分或完整的资源标识符翻译成创建组件间连接所需的网络地址信息。例如,大多数URI都包括一个DNS主机名,作为一种机制来标识该资源的命名权威。为了发起一个请求,一个Web浏览器会从URI中提取出主机名,并利用DNS解析器来获得该权威的Internet协议(IP)地址。另一个例子是某些识别模式(例如URN[124])要求一个中间组件将一个永久标识符翻译为一个更加短暂的地址,以便访问被标识的资源。使用一个或多个中间解析器(intermediate?resolvers)能够通过增加间接层的方式来延长资源引用的寿命,尽管这样做会增加请求的延迟。
????连接器类型的最后一种形式是隧道,它简单地跨连接的边界对通信进行中继,例如一个防火墙或更低层的网关。隧道作为REST的一部分来建模,而不是作为网络基础设施的一部分来进行抽象,唯一的原因是某些REST组件可能会动态地从主动的组件行为切换到一个通道。主要的例子是当响应一个CONNECT方法请求时,HTTP代理会切换到一个隧道,从而允许其客户使用一种不同的协议(例如TLS)来直接与不支持代理的远程服务器通信。当两端终止通信时,隧道就会消失。
?
(三)REST中的组件(Components)
?
??? 一个用户代理使用一个客户端连接器发起请求,并成为响应的最终接收者。最常见的例子是一个Web浏览器,它提供了对信息服务的访问途径,并且根据应用的需要呈现服务的响应。
一个来源服务器使用一个服务器连接器管理被请求资源的名字空间。来源服务器是其资源表述的权威数据来源,并且必须是任何想要修改资源的值的请求的最终接收者。每个来源服务器都为其服务提供了一个以资源的层次结构形式出现的通用的接口。资源的实现细节被隐藏在这一接口的背后。
为了支持转发,可能还要对请求和响应进行转换,中间组件同时扮演了客户端和服务器两种角色。一个代理组件是由客户端选择的中间组件,用来为其他的服务、数据转换、性能增强(performance?enhancement)、或安全保护(security?protection)提供接口封装。一个网关(也叫作反向代理)组件是由网络或来源服务器强加的中间组件,用来为其他的服务、数据转换、性能增强,或安全增强(security?enforcement)提供接口封装。需要注意的是,代理和网关之间的区别是,何时使用代理是由客户端来决定的。
?
原文地址:http://www.iteye.com/topic/398170
?
?