不是协议,而是一组约束

REST是表述性状态转移的简称,是罗伊·菲尔丁在2000年博士论文中系统阐述的分布式超媒体架构风格。它不是某种服务器软件,也不是所有Web API的统称。其重点在于组件如何协作,而非后台采用哪种编程语言。

这套风格结合客户端与服务器分工、无状态通信、可缓存响应、统一接口及分层系统;按需下载执行代码是可选约束。无状态要求每次请求自带理解它所需的信息,不依赖服务器记住前一轮会话。它并不禁止数据库持久保存文章、订单等资源状态:被排除的是隐含的客户端会话上下文,不是业务数据。

参考:[1] [2]

通过表示操作资源

资源是被标识和访问的对象或概念,表示则是能在消息中传递、反映其状态的数据及元数据。以天气服务为例,标识符可以一直指向某地当前天气,而返回的内容随时间变化。同一资源也可以按内容协商提供不同表示。因此,返回一个文件或JSON对象,不等于把后台资源本身搬到了客户端。

统一接口包括资源标识、通过表示操作资源、自描述消息,以及以超媒体驱动应用状态。HTTP为这种协作提供通用方法语义:GET取得表示,PUT以请求内容替换目标的当前表示,POST让目标处理请求内容。这些含义不应随每个资源任意改写;但列出GET、POST等方法,仍未涵盖REST的全部约束。

参考:[1] [3]

下一步来自超媒体

菲尔丁在2008年的说明中强调,客户端应从入口标识符和理解的媒体类型出发,根据收到的表示所提供的选择推进操作。超媒体不仅是供人点击的HTML链接,也可以是机器能够理解的关系和控制信息。媒体类型说明怎样理解链接、表单或其他操作线索,而不是给HTTP方法任意重定义。

例如,一个查询结果若带有可理解的下一页链接,客户端可沿它继续,而不必在程序里猜测服务器的分页地址结构。这个简化例子展示的是交互选择随表示到达的机制。反之,一个接口即使传输JSON并使用HTTP动词,若全部流程依赖外部约定和写死的地址,仍不能仅凭格式就称为符合REST。

参考:[2] [3]

效率来自可复用和可分层

缓存约束要求响应说明能否复用,而不是要求所有内容都被缓存。HTTP缓存规范区分仍在新鲜期的副本与需要重新验证的副本:前者可免去部分网络交互,后者可以通过条件请求确认是否仍适用,再更新或替换。缓存键及响应控制信息共同限制复用范围,避免把过时或不适合当前请求的数据误用。

分层使组件只需面对相邻层,允许代理、网关与共享缓存介入,不必让客户端了解整个服务器拓扑。代价也真实存在:中间层增加延迟,无状态可能重复发送信息,统一格式未必比专用接口紧凑。REST是在独立演进、可扩展性与这些成本之间的取舍,并非所有分布式应用的唯一答案。

参考:[1] [4]