知识卡片

统一接口用面向资源取代面向服务降低学习成本

普通读书笔记卡

内容

统一接口是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