本章将详细讲述REST服务(RESTful Web Service)的概念、生态环境,并通过简单的示例,使读者快速掌握REST服务开发的基本能力。

前四节将逐一解读REST的概念、REST服务、JAX-RS标准和Jersey项目。这四者之间的联系是:REST是一种跨平台、跨语言的架构风格,REST式的Web服务是对REST在Web领域的实现;JAX-RS标准是Java领域对REST式的Web服务制定的实现标准,Jersey是JAX-RS标准的参考实现,是Java EE参考实现项目GlassFish的成员项目。接下来的三节介绍基于Jersey的REST服务开发,以及Java领域中其他的REST服务框架。最后,介绍REST服务的调试工具。

1.1 解读REST

REST(Representational State Transfer)翻译为表述性状态转移,源自Roy Thomas Fielding博士在2000年就读加州大学欧文分校期间发表的一篇学术论文《Architectural Styles and the Design of Network-based Software Architectures》。REST之父在该论文中提出了REST的6个特点,分别是:客户端-服务器的、无状态的、可缓存的、统一接口、分层系统和按需编码。

REST具有跨平台、跨语言的优势。从其诞生开始,就得到了诸多语言的快速支持,最著名的是ROR(Ruby on Rails)框架。新兴的语言(比如NodeJs、Golang)、工具平台(Docker、Spark)和公有云,更是将REST默认为服务的开放形式。

1.1.1 一种架构风格

REST是一种架构风格。在这种架构风格中,对象被视为一种资源(resource),通常使用概念清晰的名词命名。

表述性状态是指资源数据在某个瞬时的状态快照。资源可以有多种表述(representation),表述状态具有描述性,包括资源数据的内容、表述格式(比如XML、JSON、Atom)等信息。

REST的资源是可寻址的,通过HTTP1.1协议(RFC 2616)定义的通用动词方法(比如GET、PUT、DELETE、POST),使用URI协议(RFC3305)来唯一标识某个资源公布出来的接口。

请求一个资源的过程可以理解为访问一个具有指定性和描述性的URI,通过HTTP协议,将资源的表述从服务器“转移”到客户端或者相反方向。

阅读指南

REST不是一种技术(technology),也不是一个标准(standard)/协议(protocol),而是一种使用既有标准:HTTP+URI+XML(XML似乎成为了数据格式的借指,不仅代表XML本身)来实现其要求的架构风格。因此,与之对应的不是SOAP协议,而是像RPC这样的架构风格。

1.1.2 基本实现形式

HTTP+URI+XML是REST的基本实现形式,但不是唯一的实现形式。REST一开始便使用已有的HTTP协议(RFC 2616)、URI协议(RFC3305)来描述其特征,而对如何使用一种编程语言来实现,并没有进行任何描述和规定,甚至应该包含哪些传输类型或者数据格式也没有描述,但通常的实现至少包含XML格式。

具体而言,HTTP协议和URI用于统一接口和定位资源,文本、二进制流、XML和JSON等格式用来作为资源的表述。正如采用已有技术XMLHttpRequest+JavaScript+XML(XML后来几乎被JSON替代)实现Ajax一样,使用HTTP+URI+XML实现REST的好处是让开发者持有这些已知的技术来开发REST的入门门槛较低,关注点更容易放到REST的核心概念和业务逻辑上。

阅读指南

以HTTP+URI+XML实现的应用并不一定是REST服务,但对于Ajax,这个逆命题是成立的。因为Ajax是一种技术,而REST是一种架构风格。学习和使用REST的关键是掌握这种思想,而不是具体的实现形式。