API 设计是有风格的,RPC
、REST
、GraphQL
是当前比较流行的三种设计风格。在后面的文章中,我们会采用 REST
风格,对 API 进行设计和实现,所以本文就和大家一起认识一下 REST
.
REST
是 Representational State Transfer
的缩略词表示,直译过来就是表征状态传输,具象状态传输,表述性状态转移,表现状态传输等,这也是网络上常见等译法。这种直译,让人有种知道每个词的意思,但不知道这些词组合起来在说什么的感觉。
所以,我们先来了解一下 REST
的产生,再尝试解释一下这个术语。
REST 历史
2000年,Roy Thomas Fielding 在他的博士学位论文——《Architectural Styles and the Design of Network-based Software Architectures》——中提出了 REST 架构风格,并在论文的第五章,CHAPTER 5 Representational State Transfer (REST),详细阐述了 REST
架构风格。与此同时,论文的作者正在进行 HTTP 1.1 协议的开发工作。正是这项工作,促成了 REST 架构风格的产生。
REST 架构风格的目标就是帮助构建高效的、可扩展的、可靠的分布式系统。分布式系统也是一个比较抽象的词,在这里,我们可以理解为由许多位于不同计算机上的软件组成,相互之间靠网络连接和通信,协同完成工作的系统。
论文作者提出,REST 架构风格的设计要满足下面六个约束(constraint)要求:
- Client/server 约束 — Client/server 约束遵循的原理是相关性隔离。当移动应用和API服务一起工作,完成用户目标时,必须明确划分他们的职责。
- Statelessness — 无状态性。每一个请求(从客户端到服务器),必须包含所有必要的信息,让服务能够理解和处理该请求,不能利用服务端存储的信息。换句话说,客户端保存完整的会话信息。
- Cacheability — 缓存能力。客户端能够存储来自服务器的响应数据,也能选择不存储。如果客户端存储了响应的数据,客户端可以重用响应数据,不必再向服务器发送请求。
- Layered system — 分层系统。服务器的系统分层设计,可以隐藏复杂的结构和逻辑。客户端只需要和系统的某一个层进行交互,不需要了解其背后处理的具体逻辑。TCP 协议就是一个典型的例子。
- Code on demand — 按需执行代码。客户端能够根据需要,从服务器下载可运行的代码(如 Javascript),实现功能扩展。这是可选约束要求。
- Uniform interface — 统一接口。这是独特的核心特征,让 REST 与其他网络设计风格区分开来:组件之间要使用统一的接口风格。当然,这也是 REST 名字的来源。定义 REST 接口要满足四个要求:资源识别;通过描述对资源操作;自描述的消息;超媒体作为应用状态引擎。
REST 解释
REST(Representational State Transfer)
译成中文的关键是对 Representational
这个词的理解。
文章开头已经给出了一些网络常见翻译,现在我们从论文里找找线索。在论文的第五章里,Representational
出现了 4 次,都是以 Representational State Transfer
的组合方式使用的。他的名词形式 Representation
出现了 53 次。下面是一些相关的摘抄。
A representation is a sequence of bytes, plus representation metadata to describe those bytes.
representation 是一串有序字节及其描述它的元数据。
Other commonly used but less precise names for a representation include: document, file, and HTTP message entity, instance, or variant.
为了帮助大家理解这个词语,作者还列举了几个相似的词语:文档(document),文件(file),HTTP 消息体(HTTP message entity),实例(instance),或变量(variant)。
A representation consists of data, metadata describing the data, and, on occasion, metadata to describe the metadata (usually for the purpose of verifying message integrity).
representation 包括数据,元数据(描述数据的数据),描述元数据的数据
。
The data format of a representation is known as a media type.
representation 的数据格式是大家所熟知的媒体类型。
大家可以把认为合理的词放入句子里,讲的通,能明白就行。当然,也可以去原文中研读更多的语境。
这里,比较合适的词可以是表示,描述,相应的 REST
可以翻译为:
- 可表示的状态传输
- 可描述的状态传输
甚至是把 Representational
这个词忽略掉,到更让人容易理解。Representational
这个词强调的应该是资源的状态是可以通过某种形式让客户端识别的。不管怎样,到底是僧敲月下门
,还是僧推月下门
,请大家见仁见智吧。