概念——表征状态转移(Representational State Transfer,REST)
本文内容
- 宗旨
- 要点
- 示例
- 优点
- 参考
表征状态转移(Representational State Transfer,REST)是 Roy Fielding 在 2000 年他的博士论文中提出来的一种软件架构风格。
目前的三种主流 Web 服务实现方式——远程过程调用(RPC),面向服务架构(SOA)以及表述性状态转移(REST),REST 方式与复杂的 SOAP 和 XML-RPC 比起来更加简洁,越来越多的 Web 服务开始采用 REST 风格设计和实现。例如,Amazon.com 提供接近 REST 风格的 Web 服务进行图书查找;雅虎提供的 Web 服务也是 REST 风格的。
远程过程调用(RPC)
远程过程调用为 Web 服务提供一个分布式函数/方法接口供用户调用。这是一种较传统的方式。通常,在 WSDL 中对 RPC 接口进行定义(类似于早期的XML-RPC)。本质上,RPC 方式利用一个简单映射,把用户请求直接转化成一个特定语言编写的函数/方法。现在,该方式已不再使用。
面向服务架构(SOA)
面向服务架构现在,业界比较关注的是遵从面向服务架构(Service-oriented architecture,SOA)来构建 Web 服务。该方式中,通讯是由消息驱动,而不再是某个动作(方法调用)。这种 Web 服务也称为“面向消息的服务”。
宗旨
表征状态转移(Representational State Transfer)从资源角度来观察整个网络,资源由通用资源标志符(Uniform Resource Identifier,URI)确定,客户端应用通过 URI 获取资源的表征,这些表征会使应用程序转变其状态。随着不断地获得资源表征,客户端应用也不断地转变其状态,这就是 REST。
这个观点不是凭空想出来的,而是通过观察当前 Web 互联网的运行方式抽象出来的。Roy Fielding 认为“ 设计良好的网络应用表现为一系列的网页,网页可以看作是虚拟状态机,用户选择链接将使网页传输到客户端,并展现给用户,而这会导致状态的转变。”
要点
REST 是种设计风格,而不是个标准。REST 通常是基于 HTTP、URI 以及 HTML 和 XML,这些目前的广泛使用的协议和标准。
- 资源由 URI 指定。
- 对资源的操作,包括获取、修改、创建和删除,这些操作对应 HTTP 协议提供的 GET、POST、PUT 和 DELETE 方法。
- 通过操作资源的表现形式来操作资源。
- 资源的表现形式是 HTML/XML,也可以是其他格式。
REST 要求
- 客户端和服务器结构
- 连接协议具有无状态性
- 能够利用 Cache 机制提高性能
- 层次化的系统
- Javascript(可选)
RESTful Web 服务
RESTful Web 服务(RESTful Web API)是一个使用 HTTP 协议,并遵循 REST 原则的 Web 服务。它从三个方面对资源进行定义:
- URI,如 http://example.com/resources/
- RESTful Web 服务可以接受与返回的互联网媒体类型,比如:JSON,XML ,YAML 等
- RESTful Web 服务支持的一系列请求方法,包括 POST、GET、PUT 或 DELETE
该表列出了在实现 RESTful Web 服务时 HTTP 请求方法的典型用途。如下表所示:
HTTP 请求方法在 RESTful Web 服务中的典型应用
资源 | GET | PUT | POST | DELETE |
一组资源的 URI, 如 http://example.com/resources/ | 列出 URI 和该资源组中每个资源的详细信息 | 用给定一组资源替换当前整组资源 | 在本组资源中创建/追加一个新资源。 该操作往往返回新资源的 URL。 | 删除整组资源 |
单个资源的 URI, 如 http://example.com/resources/142 | 获取指定资源的详细信息,格式可以 XML、JSON 等 | 替换/创建指定资源,并将其追加到相应的资源组中 | 把指定资源当做一个资源组,并在其下创建/追加一个新资源 | 删除指定资源 |
不像基于 SOAP 的 Web 服务,RESTful Web 服务并没有的“正式”标准。 因为 REST 是一种架构,而 SOAP 只是一个协议。虽然 REST 不是一个标准,但在实现 RESTful Web 服务时可以使用其他各种标准(比如HTTP,URL,XML,PNG等)。
示例
如一个简单的网络商店应用。如下所示列举所有商品:
GET http://www.store.com/products
如下所示具体某一件商品:
GET http://www.store.com/product/12345
如下所示下单购买:
POST http://www.store.com/order
<purchase-order>
<item> ... </item>
</purchase-order>
REST 优点
- 利用缓存 Cache 提高响应速度
- 无状态性使不同服务器处理一系列请求,提高服务器扩展性
- 浏览器即可作为客户端,简化软件需求
- 相对于其他叠加在 HTTP 协议之上的机制,REST 软件依赖性更小
- 不需要额外的资源发现机制
- 在软件技术演进中兼容性更好
参考
- Roy Fielding 博士论文 "Architectural Styles and the Design of Network-based Software Architectures"