最近在网上看到一篇文章(原文),写的是作者如何给完全没有技术基础的老婆大人解释什么叫REST的。看完文章,我觉得老外的思维角度和表达方式和我们熟悉的方式还是略有不同,有点把简单问题说复杂了的感觉。于是顺手给翻译过来,围观围观。
以下是译文:
Wife: Roy Fielding是个谁啊?
Ryan: 一个炒鸡聪明的牛人。
Wife: 哦?有多牛??
Ryan: 他帮忙写出了世界上第一个web servers然后做了大量的研究工作来解释网站是如何工作的。他的名字已经被写到了从服务端获取资源到浏览器端上的协议里面。
Wife: 那它是如何工作的?
Ryan: 你是说网站?
Wife: 对丫。
Ryan: 唔..好吧,这个其实挺科幻的。有趣的是这玩意儿被严重低估了。就是我刚才说的的那个协议,HTTP协议,它其实是个被大家忽视的好东西。
Wife: 你是说我输入URL的时候需要在URL前面加的那个http么?
Ryan: 是哒,这个部分是告诉浏览器你用的是啥协议。这东西是计算机历史上最重要的突破之一。
Wife: 为嘛?
Ryan: 因为它能够描述世界上任何东西的任何位置,或者从哪里来。这就是网站的基础功能。你可以理解成类似GPS定位一样的东西。
Wife: 是定位网页么?
Ryan: 事实上任何东西都可以定位。Roy Fielding这货在他的研究里面讲了很多这方面的事情。网站其实都是基于一个叫'REST'的架构上建设的。REST可以定义刚才我说的那些东西,也就是'资源'。
Wife: 所以网页也是'资源'咯?
Ryan: 算是吧..网页的话算'资源'的一种表示法吧。'资源'是概念性东西。然后URL的话就是指..
Wife: 我滋道URL是啥。
Ryan: -_- 好吧。URL会告诉浏览器在某个地方有一些资源。然后接下来浏览器才能去请求一个特定的资源表示法。以网页为例子,浏览器就是在请求得到这个资源的网页表示法
Wife: 那其他还会有什么种类的表示法吗?
Ryan: 事实上,表示法只是这些东西里面不常用的一种形式而已。大多数情况下,一个资源只会有一种单一的表示法。但是我们仍然希望'表示法'这种形式会在以后被使用得更加广泛,因为现在到处都是新的格式涌现出来。
Wife: 比如呢?
Ryan: 比如有一种被称为Web Services的概念。虽然对不同的人来说这意味着许多不同的事情,但是基本观点就是机器可以像人一样使用网站。
Wife: 这又是一个机器人领域的事情么?
Ryan: 不对,我不是在说机器人会坐到桌子前然后浏览网页. 但是计算机相互间可以利用某种共同的协议去反复发送消息给其他机器。我们已经尝试做这个很长时间了,但是如果你需要全世界所有的计算机连起来一起通信的话,到现在为止世界上还没有任何技术能做到这个。
Wife: 为什么不能?
Ryan: 因为这些计算机不是被设计出来做这个事情的。Fielding和他们小伙伴们开始创建网站的时候,把世界上所有的计算机连起来通信是作为他们主要关心的事情。大多数我们所使用的计算机通信技术没有这个需求。你只需要完成一小部分计算机通信及可以了。
Wife: 然后你需要和所有的计算机通信?
Ryan: 没错-还有更多。我们需要可以把一台计算机上所有的东西告诉其他所有的计算机。所以我们需要有一些可以把其他计算机没有的资源告诉给其他计算机的方法
Wife: 你刚才说什么?
Ryan: 这样说吧,你妹妹想借一个清洁器或者别的什么东西,但是你没有-你妈却有这个。所以你给你妹妹说让他去你妈那儿借。这个在现实生活中是常见的吧?这种场景也会在计算机通信的时候发生
Wife: 那计算机是如何告诉其他计算机哪儿有这些东西的呢?
Ryan: URL啊,如果计算机需要告知的每个资源都有一个特定的URL的话...你创造了一个相当于计算机的名词。所以你、我以及全世界都同意按照一定的方式来表达这个名词就变得特别重要是吧?
Wife: 嗯。
Ryan: 麻烦的是计算机之间没有这个概念。所有的编程语言、数据库或者不同的操作系统都会有不同的方式来交流这个名词。这就是为什么URL特别重要了。它让所有的这些系统可以按照同一种方式来交流。
Wife: 但是当我打开一个网页的时候,我也不会用计算机它们的方式来思考啊。
Ryan: 没人会用这种方式思考,除了Fielding和少数其他人以外~
Wife: 那动词代词形容词呢?
Ryan: 这个问题真有趣,这是REST的其他一个大方向..不管怎么说都要提下动词..
Wife: 开个玩笑,蛤蛤。
Ryan: 这虽然是个玩笑,但也不是一个玩笑了。动词其实也是非常重要的。有个强大的编程和CS理论叫做多态。这是一种非常极客的方式来表达一个动词可以适用于多个不同的名词。
Wife: (⊙_⊙)?
Ryan: 好吧..看看这咖啡桌,名词有哪些?杯子,托盘,报纸。现在有什么事情是你可以拿他们同时来做的?
Wife: (⊙_⊙)??
Ryan: 你可以“获取”它们,是吧?你可以拿起他们,可以敲它们,可以烧了它们。你还可以用其他的一些动词来描述其他任何放那儿的东西。
Wife: 好嘛。然后捏?
Ryan: Well,这很重要。如果我不能跟你说“获取杯子”,“获取报纸”,"获取遥控器";如果我们要用其他的动词来组合这些名词?我不能用“获取”这个词,但是需要向一个新的动词来组合。
Wife: Wow,这好奇怪的样子。
Ryan:是啊是啊,我们的大脑莫名其妙的足够聪明到知道同一个动词可以适用于许多不同的名词。一些动词可以更加精确具体,只适用于少量名词。比如说,我不能“驾驶杯子”而且不能“喝汽车”。但是有些动词却是特别普遍例如GET,PUT和DELETE。
Wife: 你不能DELETE杯子啊
Ryan: -_- 但是你可以扔掉啊,这又是一个玩笑是吧。
Wife: O(∩_∩)O~
Ryan: 言而总之,HTTP--这个Fielding和他的朋友们创造的协议--让动词适用于名词。举个栗子,当你打开一个网页,浏览器其实是在你输入的URL上做了HTTP GET请求,然后服务器给返回了一个网页。网页的话通常都会有图片是不是,这些是不同的资源。网站只会指定URL给图片们,然后浏览器会做更多的HTTE GETs请求知道这些资源被获取而且浏览器显示出来。但是重要的是这里是不同种类的名词被当做一个种类来对待。不管这个名字是图片,文字,视频还是mp3,反正我能用GET获取到所有的这些资源
Wife: 听上去GET是个非常重要的动词耶。
Ryan: 就是。尤其是当你浏览网页的时候,浏览器基本只做GET,不会有太多其他种类的交互。这个是个问题,因为他误导很多人认为HTTP是用来做GET的,然而HTTP其实是一个通用的适配动词和名字的协议。
Wife: 酷哦。然而我还是不知道这是如何改变其他东西的。你需要那个种类的动词和名词?
Ryan: 好吧名词都在这儿但是格式略不对。试想下当你在亚马逊网给我寻找圣诞礼物的时候,想象所有的商品都是一个名词。现在如果它们都是可用的计算机能够理解的表示法,你可以做超多酷炫的事情。
Wife: 为啥计算机不能理解一个普通的网页?
Ryan: 因为网站是设计来给人看的。计算机不会在意布局和格式。计算机基本上只需要数据。理想状态下,每个URL都会有一个人类可读而且计算机也可以读的表示法。当计算机GET资源的时候,它会请求计算机可读的那部分,当浏览器GET资源的时候它会请求人类可读的部分..
Wife: 所以人们必须把计算机格式给所有的页面?
Ryan: 如果有价值的话肯定会..我们已经谈论了很多概念了,不如来举个实例如何。假如你是一个老师-你有一个大的电脑系统,或者差不多3到4台计算机在学校,这让你可以管理你的学生:他们在哪个班,将会到哪个年级,紧急联系人等等。如果这个系统是一个web系统,假设每个名词例如学生,老湿,年级等都有一个特定的URL。现在URL通过浏览器给你一个网页。如果现在每个URL都有计算机可读的表示法,那这对系统来说会变得非常微不足道。因为所有的信息都会是标准的消费品。这使得各个系统之间通信也会变得更加容易。或者,你也可以去建一个可以和各个学校通信的州或者国家级别的大型系统,用来收集每个学校的分数。其它例子就不一一列举了。每一个系统都可以简单的使用HTTP GET来和其它系统通信;如果某个系统需要增加一些东西,那么可以用HTTP POST达成;如果要更新一些东西,则用HTTP PUT。最后还剩下一件事情,就是确定下最后数据的格式。
Wife: 所以这就是你和那些程序猿每天都在做的工作?决定最后这些数据的格式?
Ryan: 杯具,然而我们并不是在干这个。相反的上我们最大最主要的事情是为做这事儿的不同方法编写层层复杂的规范。名词没有普遍性动词也没有多态性。我们舍弃了使用了几十年的实域和已经被证明的技术然后用一些看上去跟其他系统很相像的曾经失败过的东西重新开始。我们正在使用HTTP但是仅仅是因为它可以让我们更少的和网络和安全人员打交道。We're trading simplicity for flashy tools and wizards.
Wife: 为啥?
Ryan: 我也不知道..
Wife: 说点儿什么啊!
Ryan: 再说吧..