第 45 章 RESTful Web 服务简介
摘要
Representational State Transfer (REST)是一种软件架构风格,中心使用 HTTP 传输数据,仅使用四个基本的 HTTP 动词。它还使用任何额外打包程序,如 SOAP 信封并使用任何状态数据。
概述
表述性状态转移 (REST)是一种架构风格,首先由名为 Roy Fielding 的研究人员介绍。在 RESTful 系统中,服务器使用 URI 公开资源,客户端则使用四个 HTTP 动词访问这些资源。随着客户端收到它们处于 状态的资源的表现形式。当用户访问新资源时,通常遵循链接、更改或转换其状态。为了工作,REST 假设资源能够使用普遍的标准 grammar 表示资源。
World Wide Web 是设计 REST 原则的系统的最普遍性例子。Web 浏览器充当访问 Web 服务器上托管的资源的客户端。资源使用 HTML 或 XML grammars 来表示,所有 Web 浏览器都可以使用。浏览器也可以轻松遵循新资源的链接。
RESTful 系统的优点在于,它们是高度可扩展且高度灵活性。由于资源是使用四种 HTTP 动词进行访问和操作,因此资源是使用 URI 公开的,并且资源会使用标准 grammars 表示,客户端不会受到服务器的更改的影响。另外,RESTful 系统还可以充分利用 HTTP 的扩展性功能,如缓存和代理。
基本 REST 原则
RESTful 架构遵循以下基本原则:
- 应用程序状态和功能划分到资源中。
- 资源可以使用标准 URI 进行寻址,这些 URI 可用作 hypermedia 链接。
所有资源都只使用四个 HTTP 动词。
-
DELETE
-
GET
-
POST
-
PUT
-
- 所有资源都提供了使用 HTTP 支持的 MIME 类型的信息。
- 该协议是无状态的。
- 响应是可缓存的。
- 协议是分层的。
Resources
资源是 REST 的中心。资源是使用 URI 寻址的信息源。在 Web 的早期阶段,资源是大量静态文档。在现代 Web 中,资源可以是任何信息来源。例如,如果 Web 服务可以使用 URI 访问资源,则可以是资源。
RESTful 端点 交换 它们地址的资源的表示法。表示是指包含资源提供数据的文档。例如,提供对客户记录的 Web 服务访问的方法是一个资源,在服务和消费者之间交换的客户记录的副本是资源。
REST 最佳实践
在设计 RESTful Web 服务时,请记住以下几点:
为您希望公开的每个资源提供不同的 URI。
例如,如果您正在构建一个处理驱动记录的系统,则每个记录都应该有一个唯一 URI。如果系统还提供有关停滞违规和加快精细的信息,每种类型的资源还应具有唯一的基础。例如,可以通过 /speedingfines/driverID和 parking violations 访问速度罚款/驱动程序ID,也可以通过 /parkingfines/driverID 访问。
在 URI 中使用 nouns。
使用 nouns 突出显示了资源是事物而不是操作的事实。URI,如 /ordering imply a action,而 /orders 则代表一个内容。
-
映射到
GET
的方法不应更改任何数据。 使用您的响应中的链接。
在响应中放入其他资源的链接可让客户端更轻松地跟踪数据链。例如,如果您的服务返回一组资源,则客户端更轻松地使用所提供的链接访问各个资源。如果没有包括链接,客户端需要有额外的逻辑才能将链跟到特定的节点。
使服务无状态化。
要求客户端或服务维护状态信息,强制两者之间的紧密耦合。紧张合作使升级和迁移更加困难。维护状态也可以使恢复从通信错误更困难。
设计 RESTful Web 服务
无论您用于实施 RESTful Web 服务的框架是什么,应遵循几个步骤:
定义服务将公开的资源。
通常,服务会公开一个或多个以树形组织的资源。例如,一个驱动记录服务可组织到三个资源:
- /license/driverID
- /license/driverID/speedingfines
- /license/driverID/parkingfines
定义您要能够对各个资源执行的操作。
例如,您可能要能够更新操作者的地址,或从驱动程序的记录中删除停滞票据。
- 将操作映射到适当的 HTTP 动词。
定义了服务后,您可以使用 Apache CXF 实施该服务。
使用 Apache CXF 实施 REST
Apache CXF 提供 RESTFul Web 服务(JAX-RS)的 Java API实施。JAX-RS 提供了一种使用注释将 POJO 映射到资源的一种标准化方法。
当从抽象服务定义移动到使用 JAX-RS 实施的 RESTful Web 服务时,您需要执行以下操作:
为资源创建一个代表该服务资源树的根资源类。
请参阅 第 46.3 节 “根资源类”。
将服务的其他资源映射到子资源。
请参阅 第 46.5 节 “使用子资源”。
创建方法,以实施各个资源所使用的每个 HTTP 动词。
请参阅 第 46.4 节 “使用资源方法”。
Apache CXF 将继续支持旧的 HTTP 绑定,将 Java 接口映射到 RESTful Web 服务。HTTP 绑定提供基本功能,并有一些限制。我们鼓励开发人员更新其应用以使用 JAX-RS。
数据绑定
默认情况下,Apache CXF 使用 Java 架构作为 XML 绑定(JAXB)对象,将资源及其表示映射到 Java 对象。提供 Java 对象和 XML 元素之间的明确定义的映射。
Apache CXF JAX-RS 实施也支持使用 JavaScript Object Notation (JSON)交换数据。JSON 是 Ajax 开发人员使用的常用数据格式。JSON 和 JAXB 之间的数据汇总由 Apache CXF 运行时处理。