REST概念¶
REST 概念的提出来自于罗伊・菲尔丁(Roy Fielding)在 2000 年发表的博士论文: 《Architectural Styles and the Design of Network-based Software Architectures》(架构风格与网络的软件架构设计) 。中文版参见 这儿
罗伊・菲尔丁(Roy Fielding)简介:
是一名很优秀的软件工程师
是 Apache 服务器的核心开发者,后来成为了著名的 Apache 软件基金会的联合创始人
是 HTTP 1.0 协议(1996 年发布)的专家组成员
是 HTTP 1.1 协议(1999 年发布)的负责人
指导设计 HTTP 1.1 协议的理论和思想,最初是以备忘录的形式,在专家组成员之间交流,
这个备忘录其实就是 REST 的雏形。
备注
什么叫『表征状态转移』?即什么是REST(Representational State Transfer)。
Fielding 在提出 REST 时,所谈论的范围是 “架构风格与网络的软件架构设计”(Architectural Styles and Design of Network-based Software Architectures),而不是现在被人们所狭义理解的一种 “远程服务设计风格”。Fielding 提的 REST 是更通用的一种设计理念
超文本(Hypertext)¶
备注
先去理解什么是 HTTP,再配合一些实际例子来进行类比,你就会发现 “REST” 实际上是 “HTT”(Hyper Text Transfer,超文本传输)的进一步抽象,它们就像是接口与实现类之间的关系。
备注
HTTP 中使用的 “超文本” 一词,是美国社会学家泰德・H・尼尔森(Theodor Holm Nelson)在 1967 年于`《Brief Words on the Hypertext》 <https://archive.org/details/SelectedPapers1977>`_ 一文里提出的
Nelson在 1992 年修正后的定义:
By now the word "hypertext" has become generally accepted for branching and responding text,
but the corresponding word "hypermedia", meaning complexes of
branching and responding graphics, movies and sound – as well as text – is much less used.
Instead they use the strange term "interactive multimedia":
this is four syllables longer, and does not express the idea of extending hypertext.
—— Theodor Holm Nelson Literary Machines, 1992
“超文本(或超媒体)” 指的是一种 “能够对操作进行判断和响应的文本(或声音、图像等)”
REST 中的关键概念¶
资源(Resource):
内容本身(可以将其视作是某种信息、数据),我们称之为 “资源”
表征(Representation):
“表征” 这个概念是指信息与用户交互时的表示形式:
如:
同一资源:
服务端向浏览器返回的 HTML 格式的数据
服务端向浏览器返回的 PDF 格式的数据
服务端向浏览器返回的 Markdown 格式的数据
服务端向浏览器返回的 RSS 格式的数据
...
上面就是同一资源的多种表征
状态(State):
在特定语境中才能产生的上下文信息就被称为 “状态”,如:
读完了这篇文章,想再接着看下一篇文章的内容时,你向服务器发出请求 “给我下一篇文章”。
但是 “下一篇” 是个相对概念,必须依赖 “当前你正在阅读的文章是哪一篇”,这样服务器才能正确回应
有状态(Stateful)还是无状态(Stateless),都是只相对于服务端来说的:
1. 服务器记住用户的状态,这是有状态
2. 客户端来记住状态,在请求的时候明确告诉服务器,这是无状态
转移(Transfer):
服务器通过某种方式,把 “用户当前阅读的文章” 转变成 “下一篇文章”,这就被称为 “表征状态转移”
统一接口(Uniform Interface):
“统一接口”,包括:GET、HEAD、POST、PUT、DELETE、TRACE、OPTIONS 七种基本操作 任何一个支持 HTTP 协议的服务器都会遵守这套规定,对特定的 URI 采取这些操作,服务器就会触发相应的表征状态转移。
超文本驱动(Hypertext Driven):
浏览器作为通用的客户端,任何网站的导航(状态转移)行为都不可能是预置于浏览器代码之中, 而是由服务器发出的请求响应信息(超文本)来驱动的。 这点与其他带有客户端的软件有十分本质的区别, 在那些软件中,业务逻辑往往是预置于程序代码之中的, 有专门的页面控制器(无论在服务端还是在客户端中)来驱动页面的状态转移。
自描述消息(Self-Descriptive Messages):
一种被广泛采用的自描述方法,是在名为 “Content-Type” 的 HTTP Header 中标识出互联网媒体类型(MIME type) 比如 “Content-Type : application/json; charset=utf-8” 互联网媒体类型(MIME type): https://zh.wikipedia.org/wiki/%E4%BA%92%E8%81%94%E7%BD%91%E5%AA%92%E4%BD%93%E7%B1%BB%E5%9E%8B