知识卡片
统一接口用面向资源取代面向服务降低学习成本
内容
统一接口是REST最容易引发争论、也是理解”面向资源好在哪”的关键原则。以
登录/注销功能为例:如果理解成login()和logout()两个独立服务,这是”符合
人类思维”的自然设计,但接口数量会随功能增长不断膨胀,每个都要单独学习;
如果理解成”Session资源”——登录是PUT Session,注销是DELETE Session,以后
查询登录信息就是GET Session——则只需设计一种资源,所有相关需求都能被这
同一套操作覆盖。这就是”抽象程度更高”的具体含义:以方法(动词)为中心的
接口天然是互相独立的,而以资源(名词)为中心的接口天然具有集合与层次
结构(如GET /users/icyfenix/cart/2能让人一眼推断出含义),调用者不需要
逐个学习方法签名,只需要理解一套通用的操作语义(映射到HTTP的GET/POST/
PUT/DELETE等标准方法)。代价是REST因此绑定在HTTP协议之上——这既是它复用
HTTP三十年成熟基础设施的优点,也是它无法触及HTTP之外特性的边界。
参考来源
- 位置:《凤凰架构:构建可靠的大型分布式系统》第2章"访问远程服务"2.2.2节
"RESTful的系统"(源文件:_epub-src对应OEBPS/Text/chapter21.xhtml)
- 结论依据:原文用login/logout对比"PUT Session/DELETE Session"、用商城
用户中心的资源层次结构(`GET /users/icyfenix/cart/2`)说明面向资源比
面向服务抽象程度更高、学习成本更低,并引用Google API Design Guide对
RPC逐方法学习负担的批评,直接支撑本卡片结论。
- 原始内容:以前,人们面向方法去设计RPC API,譬如CORBA和DCOM,随着时间
推移,接口与方法越来越多却又各不相同,开发人员必须了解每一个方法才能
正确使用它们,这样既耗时又容易出错。——Google API Design Guide,2017