RESTful 架构规范介绍

RESTful 架构是目前流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。本节讲解 REST 的概念和 RESTful 架构。

1. 什么是 REST

REST 全称是 Representational State Transfer 的缩写,中文翻译是表述性状态转移。Roy Thomas Fielding 首次在他的博士论文中提出的 REST 这个概念,他把互联网软件的架构原则,定名为 REST。

Roy Thomas Fielding 提出 REST 的概念,是为了得到一个以网络为基础的应用软件的架构,得到一个功能强、性能好、适宜通信的架构。REST 指的是一组架构约束条件和原则,如果一个架构符合 REST 的约束条件和原则,我们就称它为 RESTful 架构。

虽然 REST 本身受 Web 技术的影响很深,但理论上,REST 架构风格并不是绑定在 HTTP 应用上。目前 HTTP 是唯一与 REST 相关的应用领域,因此 REST 通常是指基于 HTTP 实现的 REST。

2. 理解 REST

REST 是 Representational State Transfer 的缩写,通过理解这个词组中每个单词的含义,去理解 REST。

2.1 资源 Resource

REST 的名称 “表述性状态转移” 中,省略了主语。REST 的全称应该是 “资源表述性状态转移”。

所谓 “资源”,就是网络上的一个实体,或者说是网络上的一个具体信息。面是一些资源的例子:
它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在,下

  • 一张图片
  • 一个视频
  • 一篇文章
  • 一篇回复

使用统一资源定位符 URI 指向资源,对应一个特定的 URI。通过 URI 要获取这个资源,因此 URI 就成了每一个资源的地址或独一无二的识别符。

下面以论坛为例,给出资源和相关 URI:

论坛中存在有多个主题 (topic),每个主题有一个唯一的 id,在这个例子中 /topics/123 标识了一个主题;每个主题下存在相应的回复 (answer),每个回复有一个唯一的 id,在这个例子中 /answers/123 标识了一个回复。

对每一种资源,可以进行增加、修改、删除的操作,在这个例子中,即为增加主题、修改主题、删除主题。

2.2 表述性 Represtation

资源是一种信息实体,在外界的具体呈现,可以有多种表述(或成为表现、表示)形式,在客户端和服务端之间传送的也是资源的表述,而不是资源本身。例如,文本资源可以采用 HTML、XML、JSON 等格式表现,图片资源可以使用 PNG 或 JPG 等等格式表现。

在 HTTP 协议中,客户端可以通过 Accept 消息头请求一种特定格式的表述,服务端则通过 Content-Type 告诉客户端资源的表述形式。

例如,在服务端存在资源 icon.png,客户端请求资源 icon.png 的 HTTP 报文如下:

GET /icon.png HTTP/1.1
Host: www.example.com
Connection: keep-alive
User-Agent: Mozilla/5.0 AppleWebKit/537.36 Chrome/81.0
Accept: text/html,image/png,*/*;
...
省略
...

在第 5 行,消息头 Accept 描述客户端希望接收的数据类型是 text/html 或者 image/png 格式。服务端收到请求报文后,响应客户端如下:

HTTP/1.1 200 OK 
server: nginx/1.14.0 (Ubuntu)
date: Wed, 09 Sep 2020 07:52:21 GMT
content-type: image/png
content-length: 194
...
省略
...

在第 4 行,消息头 content-type 描述了响应报文中的数据类型是 image/png。

2.3 状态转移 State Transfrer

在客户端和服务器的的互动过程,客户端需要通过某种手段让服务器端发生 “状态转移”(State Transfer)。例如,在论坛中,论坛当前包含的主题以及相应的回复,即为服务端的状态,增加、修改、删除主题或者回复,都会引起 “状态转移”。

根据 HTTP 标准,有 4 个 HTTP 请求方法,可以用于服务端的 “状态转移”:

请求方法 功能
GET 获取资源
POST 新建资源
PUT 更新资源
DELETE 删除资源

2.4 概括

综合上面的解释,总结一下什么是 REST:

  1. 服务端使用 URI 定位资源;

  2. 客户端和服务器之间,传递这种资源的某种表现形式;

  3. 客户端通过四个 HTTP 方法 (GET/POST/PUT/DELETE),对服务器端资源进行操作,实现 “资源表述状态转移”。

3. 例子

REST 描述的是在网络中客户端和服务端的一种交互形式,遵循 REST 原则的软件架构被称为 RESTful 架构,本小节一个具体的 RESTful 架构的例子。

3.1 资源

在一个论坛中,有两种类型的资源:主题和回复,如下所示:

每个资源都有自己的 URI,/topics/123 是 id 为 123 的主题对应的 URI,/anwers/456 是 id 为 456 的回复对应的 URI。

3.2 访问资源的 API

客户端可以查看、新增、修改、删除主题,相应的 URI 如下:

HTTP 方法 行为 URI
GET 获取所有的主题 http://www.bbs.com/topics
GET 获取特定的主题 http://www.bbs.com/topics/123
POST 新建主题 http://www.bbs.com/topics
PUT 修改主题 http://www.bbs.com/topics/123
DELETE 删除主题 http://www.bbs.com/topics/123

客户端可以查看、新增、修改、删除回复,相应的 URI 如下:

HTTP 方法 行为 URI
GET 获取所有的回复 http://www.bbs.com/answers
GET 获取特定的回复 http://www.bbs.com/answers/456
POST 新建回复 http://www.bbs.com/answers
PUT 修改回复 http://www.bbs.com/answers/456
DELETE 删除回复 http://www.bbs.com/answers/456

3.3 返回 JSON 格式的数据

客户端访问操作资源的 URI 时,服务端返回 JSON 格式的数据。例如:

1. 获取特定的主题

客户端获取 id 为 123 的主题信息,发出如下请求:

GET /topics/123

服务端返回 JSON 格式的数据:

{ 
  "title": "今天吃什么?",
  "content": "谢谢"
}

在返回的 JSON 数据中, title 表示主题的标题,content 表示主题的正文。

2. 获取所有的主题

客户端获取所有的主题信息,发出如下请求:

GET /topics

服务端返回 JSON 格式的数据:

[
  { 
    "title": "今天吃什么?",
    "content": "谢谢"
  },
  { 
    "title": "今天下雨吗?",
    "content": "有谁知道"
  }
]  

返回的 JSON 数据是一个数组,数组包含 2 项元素,每个元素表示一个主题。

4. 小结

本节讲解了 REST 的概念和 RESTful 架构,使用思维导图总结如下:

图片描述

在下一个小节中,通过具体的实例理解 RESTful 架构。