我正在从桌面开发人员过渡到Web开发人员,并且无法理解为什么HTTP是无状态的。原因是什么?像我这样的桌面开发人员可以通过哪些方式过渡到无状态开发环境?
我正在从桌面开发人员过渡到Web开发人员,并且无法理解为什么HTTP是无状态的。原因是什么?像我这样的桌面开发人员可以通过哪些方式过渡到无状态开发环境?
Answers:
这是我所见过的无状态互联网的最好解释:
我如何 向我的妻子解释REST
http://www.looah.com/source/view/2284
妻子:罗伊·菲尔丁是谁?
瑞安:有人。他很聪明。
妻子:哦?他做了什么?
Ryan:他帮助编写了第一批Web服务器,然后进行了大量研究,解释了Web为何以这种方式工作。他的名字在该协议的规范中,该协议用于从服务器到浏览器的页面获取。
妻子:它是如何运作的?
瑞安:网络?
妻子:是的。
瑞安:嗯。好吧,这真的很棒。有趣的是,它们都被低估了。我正在谈论的协议HTTP,它能够处理各种由于某些原因而被人们忽略的东西。
妻子:您的意思是http就像我在浏览器中输入的开头一样?
瑞安:是的。第一部分告诉浏览器要使用什么协议。您输入的内容是计算历史上最重要的突破之一。
妻子:为什么?
Ryan:因为它能够描述世界上任何地方的事物的位置。这是网络的基础。您可以将其想像为获取知识和信息的GPS坐标。
妻子:对于网页?
瑞恩:真的。罗伊·菲尔丁(Roy Fielding)那个人,他谈到了我所谈论的研究中这些东西所指向的内容。Web建立在称为REST的建筑风格上。REST提供了资源的定义,这就是这些东西所指向的。
妻子:网页是一种资源吗?
瑞安:有点。网页是资源的表示。资源只是概念。网址-您在浏览器中输入的内容...
妻子:我知道URL是什么。
瑞安:哦,对。这些告诉浏览器某个地方有一个概念。然后,浏览器可以要求该概念的特定表示。具体地说,浏览器要求概念的网页表示。
妻子:还有哪些其他表示形式?
瑞安:实际上,表示是其中很少使用的东西之一。在大多数情况下,资源只有一个表示。但是我们希望将来会更多地使用制图表达,因为到处都涌现出许多新格式。
妻子:喜欢什么?
瑞安:嗯。嗯,这个概念就是人们称之为Web服务。对于许多不同的人来说,这意味着很多不同的事情,但是基本概念是机器可以像人们一样使用网络。
妻子:这又是机器人吗?
瑞安:不,不是。我并不是说机器将坐在办公桌旁浏览网页。但是计算机可以使用相同的协议来回发送消息。我们已经这样做了很长时间,但是当您需要能够与全世界的所有机器通信时,我们今天使用的任何技术都无法很好地发挥作用。
妻子:为什么不呢?
瑞安:因为它们并非旨在像那样使用。当Fielding和他的伙伴开始构建网络时,能够与世界上任何地方的任何计算机进行通信都是一个主要问题。我们在工作中用于使计算机相互通信的大多数技术都没有这些要求。您只需要与一小部分计算机对话即可。
妻子:现在您需要与所有机器对话?
赖安:是的-还有更多。我们需要能够与所有计算机讨论所有其他计算机上的所有内容。因此,我们需要某种方式让一台机器告诉另一台机器有关可能在另一台机器上的资源。
妻子:什么?
瑞安(Ryan):假设您正在与姐姐聊天,而她想借用扫地机或其他东西。但是你没有它-你妈妈有。因此,您告诉姐姐从妈妈那里得到它。这在现实生活中一直都在发生,并且在机器开始讲话时也一直在发生。
妻子:那么,机器如何相互告诉事物在哪里?
Ryan: URL,当然。如果机器需要谈论的所有内容都有对应的URL,那么您已经创建了与名词等效的机器。您和我以及世界其他地方已经同意以某种方式谈论名词,这很重要,是吗?
妻子:是的。
赖安:机器没有通用名词-这就是为什么它们很烂。每种编程语言,数据库或其他类型的系统都有不同的谈论名词的方式。这就是URL如此重要的原因。让所有这些系统互相告知对方的名词。
妻子:但是当我浏览网页时,我并不这么认为。
瑞安:没人。除了Fielding和少数其他人。这就是为什么机器仍然很烂的原因。
妻子:动词,代词和形容词怎么样?
Ryan:您问的很有趣,因为这是REST的另一个重要方面。好吧,动词仍然是。
妻子:我只是在开玩笑。
瑞安:这是一个有趣的笑话,但实际上根本不是个笑话。动词很重要。编程和CS理论中有一个强大的概念,即多态性。这是一种怪异的说法,即不同的名词可以对它们应用相同的动词。
妻子:我不明白。
瑞安:恩。看咖啡桌。名词是什么?杯子,托盘,报纸,遥控器。现在,您可以对所有这些事情做些什么?
妻子:我不明白...
瑞安:你可以买到,对吗?你可以接他们。您可以将它们撞倒。你可以烧掉它们。您可以将这些完全相同的动词应用于坐在那里的任何对象。
妻子:好的...
瑞安:嗯,那很重要。如果不是我能对您说“拿杯”,“拿报纸”和“拿遥控器”怎么办?如果相反,我们需要为每个名词想出不同的动词怎么办?我不能普遍使用“ get”一词,而是不得不为每个动词/名词组合想一个新词。
妻子:哇!那真是怪了。
赖安:是的。我们的大脑以某种方式足够聪明,知道相同的动词可以应用于许多不同的名词。一些动词比其他动词更具体,仅适用于少数名词。例如,我不会开车,我不会喝酒。但是有些动词几乎是通用的,例如GET,PUT和DELETE。
妻子:你不能删除杯子。
赖安:好的,但是您可以将其丢弃。那是另一个笑话,对吗?
妻子:是的。
Ryan:所以无论如何,HTTP(Fielding和他的朋友创建的这个协议)都是关于将动词应用于名词的。例如,当您转到网页时,浏览器会对您键入的URL进行HTTP GET,然后返回一个网页。
网页通常有图像,对不对?这些是单独的资源。网页仅指定图像的URL,浏览器继续运行并在图像上执行更多HTTP GET,直到获得所有资源并显示网页为止。但是这里重要的是,可以将非常不同种类的名词视为相同。名词是图像,文本,视频,mp3,幻灯片还是其他。我可以使用给定URL的相同方式获取所有这些内容。
妻子:听起来像GET是一个非常重要的动词。
瑞安:是的。尤其是当您使用网络浏览器时,因为浏览器几乎都是justGET的东西。他们不会与资源进行很多其他类型的交互。这是一个问题,因为它使许多人认为HTTP仅用于GETing。但是HTTP实际上是将动词应用于名词的通用协议。
妻子:太酷了。但是我仍然看不到这会如何改变。您想要什么样的名词和动词?
赖安:名词在那里,但格式不正确。
想一想,当您在amazon.com上浏览时,正在寻找可以买给我圣诞节的东西。想象每个产品都是名词。现在,如果以机器可以理解的表示形式提供它们,那么您可以做很多整洁的事情。
妻子:为什么机器看不懂正常的网页?
Ryan:因为网页的设计目的是让人们理解。机器不在乎布局和样式。机器基本上只需要数据。理想情况下,每个URL都应具有人类可读和机器可读的表示形式。当机器获取资源时,它将要求机器可读。当浏览器获取人类的资源时,它将要求人类可读。
妻子:那么人们将不得不为所有页面制作机器格式吗?
瑞安:如果有价值的话。
看,我们一直在用很多抽象来谈论这个问题。我们如何做一个真实的例子。您是一名老师-我敢打赌,您在学校里有一个大型计算机系统,或者更有可能拥有三,四个计算机系统,可以让您管理学生:他们所上的课,所获得的年级,紧急联系人,信息有关您教书的书籍等信息。如果系统是基于Web的,那么这里涉及的每个名词可能都有一个URL:学生,老师,班级,书本,房间等。现在,通过URL获取浏览器会为您提供一个网页。如果每个URL都有机器可读的表示形式,那么将新工具锁定到系统上将是微不足道的,因为所有这些信息都可以以标准方式使用。每个系统彼此之间的对话也将变得更加容易。或者,您可以建立一个州或全国范围的系统,该系统能够与每个单独的学校系统进行对话以收集考试成绩。可能性是无止境。
每个系统将使用简单的HTTP GET从彼此获取信息。如果一个系统需要向另一个系统添加内容,则将使用HTTP POST。如果一个系统要更新另一个系统中的内容,则使用HTTP PUT。唯一需要弄清楚的是数据应该是什么样子。
妻子:这就是您和所有计算机人员现在正在从事的工作?确定数据应该是什么样?
瑞安:可悲的是,没有。取而代之的是,绝大多数人忙于编写复杂规范的层,以不同的方式来完成这些工作,而这些方式几乎没有用处或雄辩。名词不是通用的,动词不是多态的。我们将投入数十年的实际使用和可靠的技术,并从一些看起来与过去失败的其他系统非常相似的地方开始。我们使用HTTP只是因为它可以帮助我们减少与网络和安全人员的交流。我们正在为浮华的工具和向导交易简单性。
妻子:为什么?
瑞安:我不知道。
妻子:你为什么不说些什么?
瑞安:也许我会。
您如何看待可能存储数十亿亿亿连接的状态?:)因此,您仅在会话中需要的地方存储状态。
顺便说一句:HTTP不是无连接的。
persistent connections
,称为keep-alive。我不是网络专家,但是,您大多数时候都使用HTTP进行真正的连接:)
作为桌面开发人员,您可能会更熟悉丰富的UI体验。移至网络就像退后一步一样。在网络世界中,创造的自由更少,它可以带给您束缚的感觉。不要让那让你失望!有很多东西可以帮助您进行过渡,以下是其中的简短列表:
编程愉快!
因为曾经有一段时间没有数以百万计的网页。因为有时只有大学和研究机构只有几页。曾经有一段时间没有宽带,并且http与放置在台式电话顶部的1200波特调制解调器通信。在他们看来,曾经有一段时间“富Web应用程序”需要大量的带宽。记住,创建TCP / IP是因为早期的Internet非常不可靠。
HTTP 1.0始于1990年代初期。想一想当时的互联网状况,以及为什么他们以自己的方式设计互联网。
一切都在演变。Internet早于Web浏览器和Web。这是ftp,telnet,gopher,ping,finger和其他一些东西的冒泡锅。第一个Web浏览器Mosaic(我想是很久以前的1991年,我想是在大学里)充当了ftp和文档查看器之间的混搭。发生魔术的地方是,您可以在文档中具有链接,从而可以通过ftp传送新文档。
在接下来的20年中,我们现已发展出所有互动方式。这也不是一个快乐的发展。我们经历了浏览器大战,IE和Netscape放弃了它来控制标准(简化了一点;)),其他各种第三方也开始引入插件来提供丰富的内容。Java将会成为魔术子弹,当然也将成为Flash。有谁记得VRML插件承诺了3D世界,并提供了六打《星球大战》模型中的精确模型?
我快要走到最后了,但你明白了:)
主要原因是Aceemia认为HTTP的目的是出于可扩展性的考虑。HTML最初旨在跨学术界共享信息或论文。它是纯风格的文本。直到第一个浏览器允许您提供图片,人们才开始思考该模型之外的其他内容。
以下考虑巩固了无状态决策:
随着网页变得更加复杂并包含大量图形和样式表,HTTP的“ keep-alive”标志得到了改进。这样可以使套接字保持活动状态,并允许客户端通过相同的对话请求多个资源。
考虑到当前的互联网使用模式,原始决定仍然有效。有时可能会带来不便,但与服务器进行的几次小型量化交互要好于空闲套接字。
如果您的意思是双向浏览器。
安全原因。
例如垃圾邮件!
否则,Internet运行TCP / IP(两个协议)和UDP。
传输控制协议(TCP)是Internet协议套件的核心协议之一。TCP是该套件的两个原始组件之一,是Internet协议(IP)的补充,因此,整个套件通常称为TCP / IP。TCP提供直接在同一网络上的两个主机之间交换数据的服务,而IP处理一个或多个网络上的寻址和路由消息。特别是,TCP提供了字节流从一台计算机上的程序到另一台计算机上另一程序的可靠,有序的传递。TCP是主要Internet应用程序所依赖的协议,例如Internet,电子邮件和文件传输之类的应用程序。其他不需要可靠数据流服务的应用程序,
互联网协议(IP)是用于使用Internet协议套件跨Internet中继数据报(数据包)的主要通信协议。负责跨网络边界路由数据包,它是建立Internet的主要协议。IP是Internet协议套件的Internet层中的主要协议,其任务是仅根据其地址将数据报从源主机传递到目标主机。为此,IP定义了数据报封装的寻址方法和结构。从历史上看,IP是Vint Cerf和Bob Kahn在1974年引入的原始传输控制程序中的无连接数据报服务,另一个是面向连接的传输控制协议(TCP)。因此,Internet协议套件通常被称为TCP / IP。
在桌面应用程序中,假定用户正在执行一系列具有定义的开始和结束的任务。在这样的应用程序中,让用户登录到提供数据的任何服务器,并保持登录状态直到完成才有意义(实际上不是很多)。
Web交互(通常)不遵循相同的模型。例如,在电子商务站点中,用户可能会由于Google搜索而获得产品说明,然后立即离开该页面以查看另一个站点提供的相同产品。或者他/她可能开始结帐流程,然后确定该产品太昂贵,然后中途放弃。“超文本”的基本思想意味着从一个位置跳到另一个位置的能力和期望。
永久连接消耗资源。也许只是一个网络套接字,也许是一组解析的数据库查询;这一切都取决于应用程序。如果某个用户随时可能消失,那么保留这些资源就没有多大意义。
实际上,用户并不需要永久连接。Web应用程序维护与所需资源(例如数据库)的连接,并在所有用户请求之间共享它们。Web应用程序框架提供了会话,这些会话是有时间限制的位置,用于存储针对不同请求的每用户数据。您唯一无法(轻松地)做的是长期运行的客户端控制的事务,但这即使在维护连接的应用程序中也是一个坏主意。
这是因为服务器提供了一项服务(以其名称)。您提出请求并收到答复-就是所有这些。
关于向Web开发的过渡,我相信ASP.NET Web窗体将以一种您更容易理解的方式进行操作-但这仅仅是因为它隐藏了抽象层下实际发生的事情。