第 45 章 RESTful Web 服务简介
摘要
Representational State Transfer (REST)是一个软件架构,它围绕通过 HTTP 传输数据的数据中心,仅使用四个基本 HTTP 动词。它还使用任何额外的打包程序,如 SOAP 信封以及使用任何状态数据。
概述
Representational State Transfer (REST)是一个架构样式,首先在名为 Roy Fielding 的研究人员中描述。在 RESTful 系统中,服务器使用 URI 来公开资源,客户端使用四个 HTTP 动词来访问这些资源。当客户端收到它们处于状态的资源表示时。当访问新资源时,通常遵循链接、更改或转换其状态。为了工作,REST 假定资源能够使用普遍标准 grammar 表示。
全球 Web 是设计于 REST 原则的系统的最广泛示例。Web 浏览器充当访问 Web 服务器上托管的资源的客户端。资源使用 HTML 或 XML 图表来表示,所有 Web 浏览器都可以使用它们。浏览器还可以轻松遵循指向新资源的链接。
RESTful 系统的优点在于它们具有高度可扩展且高度灵活性。由于资源使用四个 HTTP 动词访问和操作,所以这些资源使用 URI 来公开,并且资源使用标准的 grammars 表示,所以客户端不会受服务器更改的影响。此外,RESTful 系统还可以充分利用 HTTP 的可扩展性功能,如缓存和代理。
基本 REST 原则
RESTful 架构遵循以下基本原则:
- 应用程序状态和功能被分成多个资源。
- 资源可以使用标准 URI 来寻址,它们可用作超媒体链接。
所有资源仅使用四个 HTTP 动词。
-
DELETE
-
GET
-
POST
-
PUT
-
- 所有资源使用 HTTP 支持的 MIME 类型提供信息。
- 协议是无状态的。
- 响应是可缓存的。
- 协议是层次的。
Resources
资源是 REST 的核心。资源是可以使用 URI 解决的信息源。在 Web 早期的早期,资源是大型静态文档。在现代 Web 中,资源可以是任何信息来源。例如,如果可通过 URI 访问它,Web 服务可以是资源。
RESTful 端点交换它们地址的资源的 表示。表示是一个文档,其中包含资源提供的数据。例如,提供客户记录的 Web 服务的方法将是资源,在服务和消费者之间交换的客户记录副本是资源的表示。
REST 最佳实践
在设计 RESTful Web 服务时,请注意以下几点:
为您要公开的每个资源提供不同的 URI。
例如,如果您要构建处理驱动记录的系统,每个记录都应该有一个唯一的 URI。如果系统也提供了关于 parking violations 和 speeding fines 的信息,每种类型的资源还应具有唯一的基础。例如,可以通过 /speedingfines/driverID 和 parking violations 访问速度较差,可以通过 /parkingfines/driverID 访问。
在 URI 中使用 nouns。
使用 nounss 突出显示资源是什么,而不是操作。诸如 /ordering 等 URI 代表一个操作,而 /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 Binding (JAXB)对象,将资源及其表示映射到 Java 对象。提供 Java 对象和 XML 元素之间的干净定义映射。
Apache CXF JAX-RS 实施还支持使用 JavaScript 对象表示法 (JSON)交换数据。JSON 是一种流行数据格式,供 iwl 开发人员使用。JSON 和 JAXB 之间的数据处理由 Apache CXF 运行时处理。