第 45 章 RESTful Web 服务简介

摘要

Representational State Transfer(REST)是一个软件架构风格,它围绕通过 HTTP 传输数据的中心,仅使用四个基本 HTTP 动词。它还允许使用任何额外打包程序(如 SOAP 信封和任何状态数据的使用)。

概述

Representational State Transfer (REST)是一种架构风格,首先由名为 Roy Fielding 的研究者进行代理解除。在 RESTful 系统中,服务器使用 URI 公开资源,客户端使用四个 HTTP 动词访问这些资源。客户端收到其处于状态的资源的表示形式。当它们访问新资源时,通常遵循链接、它们更改或转换,其状态为准。为了工作,REST 假设资源能够使用普遍的标准 getmmar 来表示。

World Wide Web 是设计基于 REST 原则的系统的最普遍性示例。Web 浏览器充当访问 Web 服务器上托管的资源的客户端。资源使用所有网页浏览器可以使用的 HTML 或 XMLmarmmarmmars 来表示。浏览器也可以轻松地跟踪新资源的链接。

RESTful 系统的优点在于它们具有高扩展性和高度灵活性。由于资源是使用四个 HTTP 动词访问的和操作,资源使用 URI 公开,资源使用标准 grammars 来表示,所以客户端不会受到更改服务器的影响。此外,RESTful 系统还可充分利用 HTTP 的可伸缩功能,如缓存和代理。

基本 REST 原则

RESTful 架构遵循以下基本原则:

  • 应用程序状态和功能划分到资源中。
  • 资源可以使用标准 URI 地址,这些 URI 可用作 hypermedia 链接。
  • 所有资源仅使用四个 HTTP 动词。

    • 删除
    • GET
    • POST
    • PUT
  • 所有资源都使用 HTTP 支持的 MIME 类型提供信息。
  • 协议是无状态的。
  • 可缓存响应。
  • 协议是分层的。

Resources

资源是 REST 的中心。资源是可使用 URI 解决的信息来源。在 Web 早期,资源是大量静态文档。在现代 Web 中,资源可以是任何信息来源。例如,Web 服务可以是资源,如果使用 URI 进行访问。

RESTful 端点会 交换 其地址的资源的表述。表示是包含资源提供数据的文档。例如,提供客户记录访问的 Web 服务方法是资源,在服务之间交换的客户记录副本是该资源的表示。

REST 最佳实践

在设计 RESTful Web 服务时,请记住以下几点:

  • 为您要公开的每个资源提供不同的 URI。

    例如,如果您要构建处理驱动记录的系统,则每个记录应具有唯一的 URI。如果系统还提供有关分页违规和速度信息,则每种类型的资源也应具有唯一的基础。例如,可以通过 /speedingfines/driverID 访问速度良好,并通过 /parkingfines/driverID访问异常

  • 在您的 URI 中使用 nouns。

    使用 nouns 可突出显示资源是内容而不是操作的事实。URI,如 /ordering imply a action,而 /orders 则表示一个操作。

  • 映射到 GET 的方法不应更改任何数据。
  • 使用您的响应中的链接。

    在您的响应中放入到其他资源的链接可使客户端更轻松地跟踪数据链。例如,如果您的服务返回一组资源,则客户端使用提供的链接访问各个资源会更容易。如果没有包含链接,客户端需要额外的逻辑来遵循特定节点的链。

  • 使您的服务处于无状态状态。

    要求客户端或服务维护状态信息,强制两者之间的紧密耦合。严格耦合使得升级和迁移更困难。维护状态还可以使通信错误恢复更为困难。

设计 RESTful Web 服务

无论您用来实现 RESTful Web 服务的框架,应遵循以下几个步骤:

  1. 定义服务将公开的资源。

    通常,服务会公开一个或多个资源,它们作为树形组织。例如,一个驱动记录服务可以分为三个资源:

    • /license/driverID
    • /license/driverID/speedingfines
    • /license/driverID/parkingfines
  2. 定义您要能够对各个资源执行的操作。

    例如,您可能想要更新分离的地址或从驱动程序的记录中删除分页票据。

  3. 将操作映射到适当的 HTTP 动词。

定义该服务后,您可以使用 Apache CXF 实现该服务。

使用 Apache CXF 实现 REST

Apache CXF 为 RESTFul Web 服务(JAX-RS)提供 Java API实施。JAX-RS 提供了一种标准的方法,利用注释将 POJO 映射到资源。

从抽象服务定义移到使用 JAX-RS 实施的 RESTful Web 服务时,您需要执行以下操作:

  1. 为代表服务资源树顶部的资源创建根资源类别。

    请参阅 第 46.3 节 “根资源类”

  2. 将服务的其他资源映射到子资源。

    请参阅 第 46.5 节 “使用子资源”

  3. 创建实施各个资源使用的每个 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 是 Ajax 开发人员使用的流行数据格式。JSON 和 JAXB 之间的数据放大由 Apache CXF 运行时处理。