Board logo

标题: 了解 Ruby 中的具象状态传输 (REST)-1 [打印本页]

作者: look_w    时间: 2018-4-22 16:00     标题: 了解 Ruby 中的具象状态传输 (REST)-1

具象状态传输 (Representational State Transfer, REST) 是一种架构风格,用于基于 Web 的通信,允许客户端以一种独特的方式与服务器进行通信。特别是,REST 可以将一个给定服务器内的资源表示为一种统一资源标识符 (uniform resource identifiers, URIs),这就简化了 REST 架构在超文本传输协议 (Hypertext Transport Protocol, HTTP) 上的实现。让我们首先介绍一下 REST 和 HTTP 背后的理念。随后我们将探讨数据表示法,然后使用 Ruby 语言实现一种简单的 REST 客户端。
HTTP 简单介绍让我们首先简单介绍一下 HTTP,因为这对于理解单个 REST 事务很重要。尽管 HTTP 是连接 Web 浏览器和各个服务器的基本通信协议,它也是除了 HTML 之外传输各种类型数据的一种有用的协议。
HTTP 是一种请求和响应协议,也就是说,客户端发出请求,服务器使用一个响应来满足这些请求。用于 HTTP 的实际协议对于人具有很强的可读性,为了演示 HTTP,我使用 Telnet 向 Web 服务器发出请求。
从浏览器发出的请求请注意,在  中,我手动发出的请求将被指定为 URI http://www.mtjones.com/index.html。Web 浏览器会分解该 URI,以便用于特定请求中(如  所示)。

提供了一个 HTTP 请求和一个来自 Web 服务器的部分响应。通过指定 Web 服务器域名和端口(80 是典型的 HTTP 端口),我使用 Telnet 启动了该请求。Telnet 首先使用域名的 Domain Name System 解析对 IP 地址作出响应,随后表明我已链接到 Web 服务器。然后,我指定了一个请求行(包含我的 HTTP GET 方法、一个连接到 Web 服务器上资源的路径,以及我将使用的协议(在本例中,该协议是 HTTP v1.1)。接下来,我提供一组请求标头(这组标头可能非常大,但因为我要将其键入,所以只指定 Host 请求标头,该标头表明了主机和我发出请求的可选端口)。请求后面紧跟着一个空白行,告诉 Web 服务器我的请求已经完成。Web 服务器随后提供一个响应,指明所使用的协议,并提供一个状态代码(在本例中是 200 OK,表示一个良好的请求)和其他的响应标头。随后出现一个空行,空行后面是 1944 个字符的响应。这就是资源的表示法(在本例中是一个 HTML 文档)。
清单 1. 使用 Telnet 执行一个 HTTP 事务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ telnet mtjones.com 80
Trying 198.145.43.103...
Connected to mtjones.com.
Escape character is '^]'.
GET /index.html HTTP/1.1Host: example.org

HTTP/1.1 200 OK
Date: Sun, 25 Mar 2012 05:33:07 GMT
Server: Apache
Last-Modified: Sat, 26 Sep 2009 20:22:36 GMT
ETag: "2c984bf-798-d3451b00"
Accept-Ranges: bytes
Content-Length: 1944
Vary: Accept-Encoding
Content-Type: text/html

<DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ...




本示例阐述了一个简单的事务,但是在 HTTP 中已实际实现了多种方法。GET 方法用于检索 Web 服务器中的资源,其中 HEAD 只用于获取资源的元信息(不是实际内容)。POST 方法用于向 Web 服务器提供新内容,PUT 方法用于放置 Web 服务器上现有资源的数据。 提供了 HTTP 方法的完整列表。
表 1. 常见的 HTTP 1.1 请求方法方法幂等描述OPTIONS是请求有关通信选项的信息GET是检索 URI 的表示法HEAD是检索 URI 的元信息PUT是使用一个表示法创建或取代资源POST否使用一个表示法扩大现有资源DELETEYes删除 URI 指定的资源
在这个对 HTTP 的简短探讨中,值得注意的是它是一个在资源上支持基本操作的协议。尽管 HTTP 如今常用于在服务器和客户端之间传输 Web 内容,它还是一种不断发展的协议,可用于分布式系统交互,以及用于允许异构系统进行通信和共享数据的应用程序编程接口 (APIs) 的开发。
现在,让我们使用协议堆栈来探讨 REST 层。
什么是 REST?REST 的力量REST 是一种架构风格,而不是一种协议或是实现。REST 拥有一些核心原则,但归根结底,它是一个抽象概念,而不是一个具体的实现。

REST 更像是一种架构风格,而不是特定的设计或是实现。RESTful 架构是由一组简单的约束条件的定义,如  所示。在 RESTful 架构的核心部位是一组资源。这些资源由 URI(比如一个 Uniform Resource Locator [URL])和内部表示法(通常为一种自描述形式的数据,稍后您将进行简短讨论)来识别。最后,还有一组操作,您可以使用这些操作来处理资源。
图 1. RESTful 架构的高级视图在更具体的术语中,这些资源可以表示各种类型(比如 JavaScript Object Notation [JSON])的数据对象的使用。您可以通过 URL(比如 http://www.mtjones.com)使用一组标准的操作(HTTP GET、POST 和 DELETE 等)来处理这些资源。将 HTTP 用作一种传输方式可以极大地简化 RESTful 架构的开发,因为他们使用的是一种众所周知且稳定的基础协议。HTTP 还可广泛使用,且不需要使用新的配置,包括 Internet 服务(比如网关、代理、安全执行实体和 HTTP 缓存服务)。要使 REST 服务器高度可扩展,您可以利用其他有用的功能,比如负载均衡。
RESTful 架构的特征尽管 RESTful 架构在其实现中具有相当大的自由性,但其中有一组特征还是很重要的。
REST 定义客户端-服务器架构,其中客户端可通过由服务器导出的表示法来访问服务器资源。客户端不会直接访问资源,而是通过一个统一的接口使用资源表示法进行访问。正如许多客户端-服务器架构一样,REST 也实现为一种分层架构,允许其使用低层(HTTP 负载均衡等)提供的各种功能。
然而,RESTful 架构的一个关键方面是它们是无状态的。服务器无法保存事务之间的任何客户端上下文,而且每一次事务必需包含满足特定请求所需的所有信息。此特征常常使得 RESTful 架构更可靠,还有助于增加它们的可扩展性。
样例 REST 接口让我们来看一个样例 REST 实现,介绍 RESTful 架构的一些特征。切记 REST 依赖于客户端-服务器交互(参见 )。客户端应用程序发出一个请求,并转换成一个 RESTful HTTP 请求。像发起其他 HTTP 事务一样从客户端到服务器发起该请求。服务器会处理该请求,并作出适当的响应。
图 2. RESTful 交互的分层架构您可以使用 REST API 来构建一个简单客户端的有趣示例就是 CrunchBase。CrunchBase 是一个与技术相关的企业、个人和投资者的免费数据库。除了提供传统的 Web 前端外,CrunchBase 还在 HTTP 之上提供基于 REST/JSON 的接口。
CrunchBase 通过其 API 实现了三种操作:
CrunchBase 还导出了用于其数据的五个名称空间(参见 ),以及用于 CrunchBase REST 交互的 URL 形式。(名称空间有企业、个人、产品、金融组织和服务提供商)。请注意,/v/1 表示 API 的版本,通常为 1。还需注意的是永久链接字段,该字段表示各个实体在其数据库内的惟一名称。
图 3. CrunchBase API 中的名称空间如果您想获取有关 IBM 的最新信息,可以使用 Company 名称空间来构造一个 URL(在您的浏览器中试试这个):
1
http://api.crunchbase.com/v/1/company/ibm.js




您可以将该 URL 键入到浏览器中,浏览器将为您呈现文本(基于 JSON)响应(同时使用 HTTP 标头)。当探讨 CrunchBase 的 JSON 格式数据表示法时,请查看更多相关的详细资料。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0