写点什么

透过表象看 REST

用户头像
Jxin
关注
发布于: 刚刚
透过表象看REST

一行代码,也是名片。

前些天,在一个 DDD 的小群,看到小伙伴在讨论 REST 。有个小伙伴给 RESTful API 下了个定义,说它是浏览器套娃。这很奇怪,前者是 API 的设计风格,后者是访问网站的本地客户端,两者八竿子打不着,是怎么关联上的?


要解释这个关联关系,首先得理解浏览器的本质。浏览器的本质是获取超文本内容(Hypertext)的入口。浏览器与其他联网本地客户端最大的区别,就是它不会内置任何网站的访问链接。浏览器通过用户输入的 URI 地址来访问服务器获取首页超文本内容,之后与服务器的所有交互都是基于超文本内容上面携带的超文本链接来完成。而超文本就是一种能够实现与服务端交互(基于操作发起请求,根据响应呈现反馈)的文本。这种基于超文本内容来实现交互的模式,在 REST 中就定义为超文本驱动(Hypertext Driven)。RESTful API 有六大核心特等,其中就包含这个超文本驱动。所以采用 RESTful API 的交互其实就是 超文本驱动套超文本驱动,这就是浏览器套娃要表达的寓意。


举例(执行一次浏览器请求):

浏览器通过 URI 获取超文本内容 A(html/js/css)-> 超文本内容 A 通过 URI 获取 RESTful API 的超文本内容 B(带有 URI 的 http 响应,如 图 1)

{  "self": "/users/1"  "id": 1,  "name": "Jxin",  "details": {      "rel": "用户详细信息",      "href": ${self} + "/details"    },  "buttons": [    {      "rel": "修改用户",      "href": ${self}    },    {      "rel": "删除用户",      "href": ${self}    }  ]}
复制代码

图 1

概念:格局、局、审局

在解释浏览器套娃这个案例里,我们首先是先去思考浏览器背后的本质,接着是盘点 RESTful API 的关键特征,最后顺着本质与关键特征去找其中的关联关系。这种认知方式,按系统动力学的角度来看,就是先定位关键要素(点),接着去探寻要素之间的连接关系(线),最后基于这个点线网络的认知去发散出更深层次的思考。用老祖宗的智慧来表达,这个识别点线的过程叫格局,识别完构建起来的认知叫,基于认知进行深度思考叫审局。(中国文字里面的“格”,是一个动词,是“认识”的意思。有一个词叫做“格物致知”,就是认识事物、获得知识的意思;而“局”在我这里的定义,就是基于系统动力学这种抽象要素和连接的思考模式建立起来的认知模型。所以“格局”在这里的意思就是看透事务背后的核心要素以及要素间的连接关系的过程

应用:Richardson 成熟度模型


Richardson 将服务接口按照“ REST 的程度”,从低到高分为 0 至 3 共 4 级:

  1. The Swamp of Plain Old XML:完全不 REST。

  2. Resources:引入资源的概念。

  3. HTTP Verbs:引入统一接口(GET/POST/PUT/DELETE),映射到 HTTP 协议的方法上。

  4. Hypermedia Controls:引入超文本驱动的概念。


要理解这个成熟模型,首先我们得理解 REST 背后的目的。REST 的目的是构建开放性、渐进式的软件架构。 REST 是 Fielding 以 HTTP 1.1 协议的理论框架为基础,总结提炼出来的架构风格,可以算是互联网本网的架构风格。而 Fielding 又将互联网定义为分布式超媒体信息获取系统(Distributed Hypermedia Information Retrieval System),也就是由超文本(超媒体)驱动的、分布式的信息系统。在这个系统中,信息分布在不同的服务器中,并由超文本来按需聚合。超文本满足了开放性的诉求,分布式的信息系统带来了渐进式增强的空间。

1.为什么引入资源的概念

资源天生具备层级结构。围绕渐进式的目标,超文本需要聚合和分布式的信息,反过来说超文本的 URI 要表达信息的关联关系。RPC 风格面向行为的 URI ,由于有动词做限定,所以是独立的,不足以表达这种多层次的关联关系。面向资源的 URI ,由于只有名词,天然就可以描述集合与层次结构。

资源相对行为更抽象。围绕开放性的目标,服务端为了不顾虑任何客户端,有义务帮助客户端降低理解自身服务能力的难度。RPC 风格面向行为的 URI 组成的服务能力是一个平铺的集合,面向资源的 URI 组成的服务能力是一个有结构的树。树状结构天生比平铺更易理解。


举例(注册会员):

// Jxin添加 月卡权益 中 普通月卡 2021-10~2021-11 的特权URI: "/users/{Jxin}/privilege/{月卡}/months/{普通月卡}/ranges" TYPE: POSTBODY : {"start": "2021-10", "end":"2021-11""}// Jxin增加 会员权益 中 充值会员 100元 积分      URI: "/users/{Jxin}/privilege/{会员}/members/{充值会员}/score" TYPE: PUTBODY : {"money": 100}        
复制代码


用户头像

Jxin

关注

极限编程小🐎农 2018.09.22 加入

你的每一行代码,都是你的名片。

评论

发布
暂无评论
透过表象看REST