层楼

Write codes that work and speak

0%

【译】我如何跟老婆解释什么是REST

译自:How I Explained REST to My Wife

妻子:Roy Fielding是谁?

瑞安:某个人,他很聪明。

妻子:是吗?他做了什么?

瑞安:他帮助编写了第一个Web服务器,然后进行了大量研究,解释了Web的工作原理。他的名字写在从服务器请求页面的协议规范里。

妻子:它是如何工作的?

瑞安:Web?

妻子:是的。

瑞安:嗯,好的。这真的很神奇。而且有趣的是人们一直低估了它。我之前提到的HTTP协议,它可以执行各种巧妙的操作,但是人们出于某些原因忽略了。

妻子:你是说我在浏览器里输入的那个开头吗?

瑞安:是的。那个开头告诉浏览器使用的是什么协议。你在那输入的内容是计算机史上最重要的突破之一。

妻子:为什么?

瑞安:因为它能从世界任何地方描述世界任何地方任何事物的位置。它是Web的基础,你可以把它想象成信息和知识的GPS坐标。

妻子:对于网页来说吗?

瑞安:对于任何东西都可以。那个叫Roy Fielding的家伙,在我之前提到的研究中谈了很多关于这些东西指向的东西。Web是建立在一种名为REST的架构风格上的。REST提供了资源的定义,也就是这些东西所指向的东西。

妻子:网页是资源吗?

瑞安:有点像吧。网页是资源的表示形式。资源只是概念。URL是你在浏览器里输入的东西。

妻子:我知道什么是URL。

瑞安:哦,对了。那些URL会告诉浏览器有一个概念存在。然后,浏览器可以请求这个概念的一种特定表示形式。具体而言,浏览器会请求概念的网页表示形式。

妻子:还有其他类型的表现形式吗?

瑞安:实际上,表现形式是一个很少使用的概念。在大多数情况下,一种资源只有一种表现形式。但是我们希望将来表现形式能更多的被使用,因为现在到处都在涌现着新的格式。

妻子:比如说呢?

瑞安:嗯。比如说有一个Web Services的概念。对于不同人群来说意义不同,但是基本概念是机器可以像人类一样使用网络。

妻子:这是又一个机器人吗?

瑞安:不,不完全是。我的意思不是机器会坐在桌子前浏览网络。而是说计算机可以使用相同的协议来相互发送消息。我们一直在这样做,但是当你需要与全球所有机器进行交互时,我们现在使用的技术不能胜任。

妻子:为什么不呢?

瑞安:因为我们现在使用的技术不是为了这样的用途而设计的。Fielding和他的朋友们开始构建Web时,主要关心的就是能够与世界上任何机器进行交流。我们在工作中使用的大多数技术并没有这些要求,你只需要与一小组机器交流。

妻子:现在你需要和全世界所有机器交流吗?

瑞安:是的,甚至更多。我们需要让所有机器了解所有其他机器上的所有内容。所以我们需要一种方法,让一台机器告诉另一台机器,关于可能位于另一台机器上的资源信息。

妻子:什么意思?

瑞安:比方说,你正在和你姐聊天,她想借个扫帚或者其他什么东西。但你没有,你妈有。所以你告诉你姐去你妈那拿。这在现实生活中经常发生,当机器开始交流时也经常发生。

妻子:那么机器如何告诉彼此东西在哪里?

瑞安:当然是通过URL了。如果机器需要交流的所有内容都有相应的URL,那么你就创造了相当于名词的机器。你、我和全世界都同意用某种方式谈论名词就非常重要了,不是吗?

妻子:是的。

瑞安:机器没有通用的名词,所以它们很差劲。每种编程语言、数据库或其他类型的系统都有一种不同的方式来描述名词。这就是 URL 如此重要的原因。它使所有这些系统能够相互告知各自的名词。

妻子:但是当我看网页时,我没有这样想过。

瑞安:没有人这样想。除了Fielding和少数其他人。这就是为什么机器仍然很差的原因。

妻子:那动词、代词和形容词呢?

瑞安:你问的这个很有趣,因为这是REST的另一个重要方面,至少是动词。

妻子:我只是开玩笑。

瑞安:这是一个有趣的笑话,但实际上真的不是一个笑话。动词非常重要。编程和计算机科学理论中有一个强大的概念,叫做多态。这是一种不清不楚的说法,意思是不同的名词可以应用相同的动词。

妻子:我没明白。

瑞安:那好吧。看看咖啡桌。名词是什么?杯子、托盘、报纸、遥控器。现在,你能对这些物体做些什么呢?

妻子: 我还是没明白。

瑞安:你可以拿起它们,对吗?你可以拿起它们。你可以把它们打翻。你可以把它们烧掉。你可以将这些相同的动词应用于其中任何一个物品。

妻子:好的,那又怎样呢?

瑞安:嗯,这很重要。如果我不能跟你说“拿杯子”、“拿报纸”和“拿遥控器”,而是需要为每个名词想出不同的动词,那该怎么办呢?我不能用“拿”这个动词,而是必须想出许多新词。

妻子:哇!这有点奇怪。

瑞安:是的,的确如此。我们的大脑似乎足够聪明,知道相同的动词可以应用于许多不同的名词。有些动词比其他动词更具体,只适用于一小部分名词。例如,我不能驾驶杯子,也不能喝一辆车。但是有些动词几乎是通用的,例如GET、PUT和DELETE。

妻子:你不能DELETE一个杯子。

瑞安:嗯,好吧,但你可以把它扔掉。这又是一个笑话,对吧?

妻子:是的。

瑞安:无论如何,HTTP这个由Fielding和他的朋友创建的协议,都是关于将动词应用于名词。例如,当您访问网页时,浏览器会对你输入的URL执行HTTP GET操作,然后返回一个网页。

网页上通常有一些图片,是吧?这些是单独的资源。网页只是指定了图片的URL,然后浏览器会对它们执行更多的HTTP GET操作,直到获取所有资源并显示网页。但重要的是,各种不同种类的名字可以以相同的方式处理。无论名词是图像、文本、视频、mp3、幻灯片等等。给定一个URL,我可以用相同的方式获取所有这些东西。

妻子:听起来GET是一个非常重要的动词。

瑞安:确实是这样的。尤其是当你使用Web浏览器时,因为浏览器几乎只是GET东西。它们不会与资源进行其他各种类型的交互。这是一个问题,因为这导致许多人认为HTTP只用于GET,但HTTP实际上是将动词应用于名词的通用协议。

妻子:酷。但我仍然不明白这改变了什么。你想要什么样的名词和动词?

瑞安:好吧,名词是有的,但是格式不对。想象一下,当你在逛亚马逊,给我买圣诞礼物时,每个商品都代表一个名词。如果它们以一种机器可以理解的表现形式提供出来,你就可以做很多有趣的事。

妻子:为什么机器不能理解正常的网页?

瑞安:因为网页是为人类设计的。机器不关心网页的布局和样式。机器基本上只需要数据。理想情况下,每个URL都该有人类可读和机器可读的表示形式。当机器获取资源时,它会请求机器可读的形式。当浏览器为人类获取资源时,它会请求人类可读的形式。

妻子:那么人们需要为所有页面制作机器格式吗?

瑞安:如果有价值的话,为什么不呢。

听着,我们一直在抽象地讨论这个问题。不如我们拿一个真实的例子来看看。你是一个老师,我打赌你们学校有一个大型计算机系统,或者可能是三或四个计算机系统,让你管理学生:他们在哪些班级,他们考试成绩如何,它们的紧急联系人,你教学用的书籍等等。如果这些系统是基于Web的,那么每个名词都可能有一个URL:学生,老师,班级,书籍,房间等等。现在,通过浏览器访问URL会给你一个网页。如果每个URL都有一个机器可读的形式,那么将新工具连接到系统上将变得非常容易,因为所有信息都可以以标准方式使用。这也让系统之间的通信更加容易。或者,你可以建立一个省级或国家级的系统,与每个学校的独立系统通信,收集测试成绩。可能性是无限的。

每个系统都将使用简单的HTTP GET从彼此获取信息。如果一个系统需要向另一个系统添加某些内容,它可以使用HTTP POST。如果一个系统想要更新另一个系统中的某些内容,它会使用HTTP PUT。现在唯一需要解决的问题是数据应该是什么样的。

妻子:所以这就是你和其他计算机专业人士现在研究的东西吗?决定数据应该是什么样的?

瑞安:很遗憾,并不是。相反,大多数人忙于编写复杂规范的层级,以不同的方式来完成这个任务,即使并不是很有用,也不够简洁。名词并不是通用的,动词也不是多态的。我们抛弃了数十年的实际应用和久经考验的技术,重新开始使用看起来与过去失败的其他系统非常相似的东西。我们使用HTTP,只是因为它帮助我们少跟网络和安全人员交流。我们用华丽的工具和向导来换取简单性。

妻子:为什么?

瑞安:我不知道。

妻子:你为什么不说点什么?

瑞安:也许我会的。