Ryan Tomayko:我怎样向老伴解释REST

原文请见(The original post is here):http://tomayko.com/writings/rest-to-my-wife

Wife: 谁是Roy Fielding?

Ryan: 某男,很聪明。

Wife: 哦,他干哈的?

Ryan: 他帮着写了第一个Web服务器,又对于Web的如此运行做了大量的研究他的名字在规定浏览器如何从服务器获取页面的协议规范里都有。

Wife: 咋弄的?

Ryan: 你是说web?

Wife: 嗯哪。

Ryan:哦,啊,这真是很神奇。最奇怪的是人们常常低估这个协议,我是说HTTP,几乎可以做任何事情,干净利落,却总是被人们忽视。

Wife: 你是说 http,就是我每次在浏览器地址栏中输入的那个?

Ryan: 是啊,这第一部分告诉浏览器用什么协议,这个东东可以说是整个计算机历史上最重要最具突破性的进展。

Wife: Why?

Ryan: 因为它能够在世界上任何地方指向在世界上另一个地方的某样东西。他是万维网的基础,你可以把它当作知识或者信息的GPS系统。

Wife: 获取网页?

Ryan:实际上可以获取任何东西。这个Roy Fielding专门研究这些东西如何指向什么东西,万维网就建立在一种叫做REST的架构之上,REST 定义了“资源”,就是所指向的那些东西。

Wife: 网页也是资源?

Ryan: 算吧是一种。网页是一个资源的“表现物”。资源只不过是一个概念,用URL来代表,也就是那些你键入在浏览器地址栏中的东西。

Wife: 我知道什么是URL…

Ryan: 哦,是了,它告诉浏览器某处有一个概念,浏览器就请求索取这个概念的“表现物”,即以这个网页来代表。

Wife: 那么还会有什么其它的表现物呢?

Ryan: 实际上表现物并不多,资源经常只有一种表现形式,但我们希望将来会有很多,因为总有很多新格式不断冒出来。

Wife: 比如?

Ryan: 呵呵,有一个概念叫“Web服务”,对不同的人可能有不同的含义,但它的基本意思是机器可以像人一样使用Web。

Wife: 又是机器人之类的东西?

Ryan:不,不太一样。我不是说机器可以坐在桌子边上浏览Web,而是计算机可以使用相同的协议互相收发信息。我们实际上早就能这样做了,但让我们对全世界所有的机器都这样做,现在的技术还打不到。

Wife: 为什么不行?

Ryan:因为没有这样设计。当Fielding和他的同伴开始构建Web的时候,具备对话任何地方任何一台机器的能力是一个重要的需求,但当时的计算机互联技术还都没有这种考虑,只需要在很小的范围内沟通。

Wife: 现在需要所有机器都互相对话?

Ryan:是啊,不仅如此,我们需要所有的机器都能跟所有其它的机器谈论他们肚子里的东西,我们也要有办法让一台机器告诉另一台机器关于第三台机器里有某个资源。

Wife: 什么?

Ryan:比方说你的小姐妹要向你借吸尘器用用,但是你没有,你大姨有,于是你告诉她向你大姨借。在生活中这很常见,同样如果机器能够互相通话也会经常发生。

Wife: 那么机器是如何说东西在哪里的?

Ryan: 当然是URL。如果机器要说的所有东西都有一个URL,也就是说你同意说“那台机器所指的即等同于一个名词“,你、我以及其他人都同意以某种方式谈论这些个”名词“,这很重要,是吗?

Wife: 当然。

Ryan:机器并没有名词——那是他们的悲哀。每一种编程语言、数据库或者系统都有不同的”名词“,这就是URL如此重要的原因,它使所有这些系统能够沟通彼此的”名词“。

Wife: 但是当我浏览一个页面的时候,并不是这样看的。

Ryan: 没人这样看,除了Fielding和他的那班人,所以说机器还是很悲哀。

Wife: 那么动词、代词、形容词呢?

Ryan: 有意思你竟然问了,这正是REST的另一个重要方面。我们先来说说动词。

Wife: 我只是开个玩笑。

Ryan:这是个有趣的玩笑,但其实根本不是玩笑。动词非常重要,计算机理论中有一个强大的概念:”多态性“,用技客的话说,不同的名词可以使用同样的动词。

Wife: 不懂。

Ryan:好吧…看那个咖啡桌,名词是什么?杯子、盘子、报纸、遥控器,对所有这些,你可以做什么?

Wife: 没明白(get获得)你的意思…

Ryan: 你可以“获得“(get)他们,是吗?你可以拿起它们,敲打它们,烧掉它们,你可以对它们用同样的动词。

Wife: OK,那又怎样?

Ryan:这很重要,如果不是我对你说”去拿(get)杯子“、”去拿报纸“、”去拿遥控器“,或者我们用其它动词说这些东西,我不能总用”去拿“这个词,我们必须想一些新词进行动名词组合。

Wife: 哇,不可思议。

Ryan:是,我们的大脑很聪明,可以用一个动词对付很多不同的名词,某些动词比另一些更专指,只能用于少量的名词。例如,我不能驾驶一个杯子,也不能喝一辆汽车,但是有一些动词就具有普适性,例如GET(获得),PUT(送出)DELETE(删除)。

Wife: 你不能删除一个杯子!

Ryan: 啊啊,好吧,我们可以把它扔掉。这又是一个玩笑,是吗?

Wife: 恩。

Ryan:所以,无论如何,Fielding和他的朋友创造的HTTP协议,就是负责把动词赋给名词的。例如,当你要浏览一个网页时,浏览器就对你键入的那个URL采用HTTP的GET(获取)操作,以获取那个网页。网页通常包括图像,对吧?这些都是不同的资源,网页只是指明这些图像的URL以便浏览器逐个”获取“并显示他们。其中很重要的是:各类不同的名词可以采用相同的方式来处理,不管这些名词是图像、文本、视频、mp3、幻灯片等等,我们都可以通过URL以相同的方式获得它们。

Wife: 这样看来GET一定是个很重要的动词。

Ryan: 正是。特别是当你使用浏览器的时候,浏览器几乎只用”GET’获取东西,而不常与资源进行其它方式的交互。这样就造成一个问题:人们常以为HTTP只会“获得”东西。其实HTTP实际上是把动词赋予名词的一般协议。

Wife: 酷!可是我还是没有看出有什么不同,你需要什么名词和动词呢?

Ryan: 名词已经有了,但形式不对。

试想你正在浏览亚马逊网站,想给我买圣诞礼物。如果每一件商品都是一个名词,如果用一种机器能够懂得的方式表达,你可以做很多漂亮的事情。

Wife: 机器为什么不能懂得一个通常的网页呢?

Ryan:因为网页是设计给人看的,机器是不管排版和风格的。机器通常只需要数据,理想情况:每个URL都应该包含一个给人看的网页和一个给机器读的表达,当一个机器“获取”一个资源,应该只给那个为机器准备的东东,如果一个浏览器“获取”,就给那个给人看的网页。

Wife: 因而人们就应该为机器准备那些给机器读的格式?

Ryan: 如果值得的话。

你看,我们谈论了很多抽象的事情,何不举个具体的例子呢?你是一个老师–在学校里一定有一个不小的计算机系统,甚至可能有三、四个计算机系统,来管理学生、安排课程、记录成绩、存储教学信息和参考资料等等。如果这些系统是基于Web的,可能对于这里的每一个名词:学生、老师、班级、教材、教室等都有一个URL。一般而言你如果用浏览器访问这些URL,你可以看到记载它们的网页。而如果每个URL同时有给机器获取的内容,则会给系统带来许多新奇的工具,因为所有的信息都会以另一种标准方式获得利用。每一个系统之间也可以更方便地“对话”。或者,你就可以建立一个在全国范围内可以使每个学校的系统互相”对话“的系统以汇总考试成绩,等等,潜力未可估量。

每个系统都可以采用简单的HTTP协议从其它系统中获取信息。如果一个系统需要向另一个系统增加东西,它可以用HTTP的POST命令,如果一个系统想更新另一个系统的数据,它可以用HTTP的PUT命令。剩下的事情只有搞清楚数据应该看起来像什么了。

Wife: 这就是你和你那些计算机哥们整天整的东西?决定数据看起来像什么吗?

Ryan:很不幸,不是的。大多数人都忙着写一些复杂的层次规范,想以不同的方式达到同样的目的,但实际上不是那么有用和有效。名词并不通用,动词也不多态。我们扔掉了几十年的经验总结和已被验证的技术,却以过去失败的系统另起炉灶。我们用HTTP只是因为它能帮助我们少与我们的网络和安全人员对话。我们丧失了简单性,换来了炫目的工具和魔术。

Wife: 这是为什么涅?

Ryan: 木有概念。

Wife: 你为嘛不说点啥?

Ryan: 中,以后再说。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值