0. 世界上第一个网站

1990年12月20日,这一天对于现在的互联网来说意义非凡。欧洲核子研究组织(CREN)的科学家Tim Berners-Lee在一台NeXT电脑上启动了世界上的第一个网站(当然当时仅能Tim Berners-Lee自己访问),这台电脑至今仍保留在CREN,但当年那个网站已经不复存在了。鉴于这个网站的意义重大,CREN在2013年“复刻”了这个网站,并指向了原来的网址:http://info.cern.ch/。由于现在的浏览器早已不是当初的样子,所以CREN还提供了一个模拟器来模拟当时浏览这个网站是什么情形(http://line-mode.cern.ch/www/hypertext/WWW/TheProject.html),打开后如下:

哈哈,看起来是不是很酷炫的样子。

1. Hypermedia

我们注意看它的第一句话:

The WorldWideWeb (W3) is a wide-areahypermedia information retrieval initiative aiming to give universal access to a large universe of documents.

大意是说www是一个为了让全世界都能访问大量文档的一个的超媒体信息检索计划,其中重点在于其提到的hypermedia。我们看看它怎么解释hypermedia是什么的:

Hypertext is text which is not constrained to be linear.

Hypertext is text which contains links to other texts. The term was coined by Ted Nelson around 1965 (see History ).

HyperMedia is a term used for hypertext which is not constrained to be text: it can include graphics, video and sound , for example. Apparently Ted Nelson was the first to use this term too.

Hypertext and HyperMedia are concepts, not products.

其中解释了什么是hyperhtext(包含link的文本内容),又指出了hypermedia是一个术语,不仅仅指代hypermeida,还可以包括一些图像,视频,声音等等。hypertext这个术语名字并不是由Tim Berners-Lee提出的,而是在更早的1965年由Ted Nelson第一次提出这个概念(hypertext历史)。不知道大家对于hypertext这个词是不是感觉很熟悉的样子,大名顶顶的HTML(HyperText Markup Language)就是它的一个具体实现。hypertext中的link一直是重中之重,试想如果没有这样一种机制把各种文档联系起来,那么孤零零的一些文本内容是如何也不会发展出后来的互联网的。

hypermedia是web中的重中之重的一个角色,可以说没有它就没有今天的web。

2. HTTP历史的简单回顾

具体的HTTP协议最早是版本0.9,发布与1991年(HTTP 0.9 https://www.w3.org/Protocols/HTTP/AsImplemented.html)。从现在的角度看可以说是一个很简陋的协议,只支持GET请求,无request header,所以只能用来展示静态文本内容,不对对于当时来说已经足够了,毕竟当初Web建立的初衷仅仅是为了在这些科学家之间共享文档信息用的。

随着Web的迅猛发展,只读的HTTP 0.9已经无法满足Web的胃口了。在1996年HTTP 1.0诞生,最突出的改进在于支持POST来写数据了(基于HTML表单,HTML最初的标准诞生于1993年),使得Web终于“活了”起来。在HTTP 1.0协议的专家组中,有一个年轻人脱颖而出,后来成为了HTTP/1.1协议专家组的负责人。这位年轻人就是Apache HTTP服务器的核心开发者Roy Fielding,Apache软件基金会的合作创始人,也是URI协议的主要设计者,同时也参与了HTML的设计。

在1999年,Tim Berners Lee和Roy Fielding以及HTTP1.1专家组发布了HTTP 1.1版本,主要是对1.0的一些多余的设计做了一些精简和优化,比如我们现在可以在一台机器上部署多个网站,而用不同的host请求头来区分,而这个host请求头是在1.1才引入的。1.0的时候HTTP协议对网站的假设是基于一个IP对应一个网站,从来没有料到后来的一个ip会部署这么多个web站点。

HTTP 1.1从1999年至今坚挺了18年,随着越来越丰富富庞大的web,性能有点跟不上去了。后来Google搞了一个SPDY协议,在TCP和HTTP之间增加了一层,重点在于提示传输性能和增加安全性,但是却强制了采用TLS。后来制订了新版的http2,移除了强制TLS的要求,至于为什么,原因很简单,这个要求违反了REST的架构约束,至于违反了哪些约束,后面的博客会解释。

3. REST的诞生

在上面我们提到一个人:Roy Fielding,他在和他的同事们在HTTP/1.1协议的设计工作中,对于Web之所以取得巨大成功,在技术架构方面的因素做了一番深入的总结。Fielding将这些总结纳入到了一套理论框架之中,然后使用这套理论框架中的指导原则,来指导HTTP/1.1协议的设计方向,HTTP/1.1协议的第一个草稿是在1996年1月发布的,经过了三年多时间的修订,于1999年6月成为了IETF的正式规范。用来指导HTTP/1.1协议设计的这套理论框架,最初是以备忘录的形式在专家组成员之间交流,除了IETF/W3C的专家圈子,并没有在外界广泛流传。

Fielding在完成HTTP/1.1协议的设计工作之后,回到了加州大学欧文分校继续攻读自己的博士学位。第二年(2000年)在他的博士学位论文Architectural Styles and the Design of Network-based Software Architectures中,Fielding更为系统、严谨地阐述了这套理论框架,并且使用这套理论框架推导出了一种新的架构风格,并且为这种架构风格取了一个令人轻松愉快的名字“REST”——Representational State Transfer(表述性状态转移)。在这篇论文中,Fielding认为Web得以蓬勃发展的原因很大程度上得益于Web的架构设计满足了互联网规模的分布式超媒体系统的需要。而他总结整体推导出来的REST,正是Web的架构风格。

本篇先开个头,简单介绍一下web的历史,以及REST是怎么来的,干什么用的。后面会逐一解释什么笔者眼中的REST是什么,欢迎有兴趣的前来讨论。

参考资料

世界上诞生的第一个网站:http://info.cern.ch/

世界上诞生的第一个网站-模拟器:http://line-mode.cern.ch/www/hypertext/WWW/TheProject.html

Web的生日:http://home.cern/topics/birth-web

HTTP 0.9 :https://www.w3.org/Protocols/HTTP/AsImplemented.html

HTTP 历史:https://www.w3.org/Protocols/History.html

HTTP 1.1 : https://www.ietf.org/rfc/rfc2616.txt

理解本真的REST:http://www.infoq.com/cn/articles/understanding-restful-style/

Tim Berners Lee :https://en.wikipedia.org/wiki/Tim_Berners-Lee

Roy Fielding:https://en.wikipedia.org/wiki/Roy_Fielding

Roy Fielding谈Google SPDY协议:http://www.infoq.com/cn/news/2012/07/roy-on-google-spdy?utm_source=news_about_spdy-agreement&utm_medium=link&utm_campaign=spdy-agreement

架构风格与基于网络应用软件的架构设计(中文修订版):http://www.infoq.com/cn/minibooks/web-based-apps-archit-design

[REST] 1.REST的起源的更多相关文章

  1. Effective Objective-C 2.0 — 第一条:了解Objective-C语言的起源

    第一条: 了解Objective-C语言的起源 由Smalltalk演化而来,消息型语言的鼻祖(messaging structure)而非 (function calling)函数调用 //Mess ...

  2. Java起源、发展历程、环境变量、第一个Java程序等【1】

    若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 请尊重作者劳动成果,转载请标明原文链接: 本文原创作者:pipi-changing 本文原创出处:http://www.cnblogs.com/pi ...

  3. atitit.GMT UTC Catitit.GMT UTC CST DST CET 星期 月份 节日 时间的不同本质and起源

    atitit.GMT UTC Catitit.GMT UTC CST DST CET 星期 月份 节日 时间的不同本质and起源 1. GMT(Greenwich Mean Time)是格林尼治平时 ...

  4. 2016动作短片《全境封锁:特工起源》HD720P.英语中字

    导演: 德文·格雷厄姆主演: Matt Lynch / Sasha Andreev / Amanda Day类型: 动作 / 短片制片国家/地区: 美国语言: 英语上映日期: 2016-01-19片长 ...

  5. JSP起源、JSP的运行原理、JSP的执行过程

    JSP起源 在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变. 如果使用Servlet程序来输出只有局部内容需要动态改变的网页,其中所有的静态内容也需要程序员用Java程序 ...

  6. Spring核心框架 - AOP的起源及介绍

    一.AOP技术起源 AOP技术的诞生并不算晚,早在1990年开始,来自Xerox Palo Alto Research Lab(即PARC)的研究人员就对面向对象思想的局限性进行了分析.他们研究出了一 ...

  7. 一篇文章让你读懂 OpenStack 的起源、架构和应用

    OpenStack 是一个面向 IaaS 层的开源项目,用于实现公有云和私有云的部署及管理.拥有众多大公司的行业背书和数以千计的社区成员, OpenStack 被看作是云计算的未来.目前 OS 基金会 ...

  8. Hadoop 系列 - (1) - 学习随笔 - 起源、构成

    起源:Hadoop是google 的集群系统的开源实现            --Google集群系统,:GFS(Google file system),MapReduce,BigTable(严格意义 ...

  9. Linux的起源、特点和版本号

    前言 最近上陈渝老师的<高级操作系统>,需要在ucore实验平台上完成一个麻雀虽小五脏俱全的OS,本着看过一小半<30天自制操作系统>的自信,以为这不过是小case,怎料被虐得 ...

  10. [原创].NET 分布式架构开发实战之一 故事起源

    原文:[原创].NET 分布式架构开发实战之一 故事起源 .NET 分布式架构开发实战之一 故事起源 前言:本系列文章主要讲述一个实实在在的项目开发的过程,主要包含:提出问题,解决问题,架构设计和各个 ...

随机推荐

  1. iOS开发 MVVM+RAC 的使用

    好长一段时间没有敲简书了! 主要是因为一直在跑面试. 终于还是在上海入职了! 由于项目原因最终还是入了MVVM+RAC的坑 下面是正题. Demo效果 使用MVVM+RAC请求网络数据 Reactiv ...

  2. Objective-C NSFileManager的使用 各种文件操作

    所有方法 都很简单,大概记录一下,写文件并没有是追加的方式而是简单的覆盖 //创建文件夹 - (BOOL)creatDir:(NSString*)newDirName at:(NSString*)di ...

  3. 计算机网络之应用层_part -1

    应用层协议原理 一.网络应用程序体系结构 网络应用程序体系结构是由程序研发者设计的,规定了如何在各种端系统中组织该应用程序,主要流行的有两种: 1.客户--服务器体系结构: 有一个总是打开的主机(称为 ...

  4. 智慧航空AI大赛-阿里云算法大赛总结 第一赛季总结

    [以前的文章]最后一公里极速配送 - 阿里云算法大赛总结 总结一下新的教训 1.由于都是NP难题,获得最优解用常规的方法非常困难,对于不是算法科班出身的人来说,首先应该到网络上寻找一下论文,是否有一些 ...

  5. 如何将Android Studio与华为软件开发云代码仓库无缝对接(二)

    上篇文章:如何将Android Studio与华为软件开发云代码仓库无缝对接(一) 上一章讲了,如何用Android Studio以软件开发云代码仓库为基础,新建一个项目.接下来,这一章继续讲建好项目 ...

  6. Python网络数据采集7-单元测试与Selenium自动化测试

    Python网络数据采集7-单元测试与Selenium自动化测试 单元测试 Python中使用内置库unittest可完成单元测试.只要继承unittest.TestCase类,就可以实现下面的功能. ...

  7. Docker跨主机网络——overlay

    前言 在Docker网络--单host网络一文中,我为大家总结了Docker的单机网络相关知识和操作,单机网络比较容易.本文我为大家总结Docker跨主机通信相关知识.同样本文大部分内容以CloudM ...

  8. BFS:noi6044鸣人与佐助

    PS:一道XX到我心态崩溃的好(傻逼)题. 先粘题目: 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到,只不过 ...

  9. 菜鸟帮你跳过openstack配置过程中的坑

    一:前言 对于一个以前做java全栈工程师而言,而且没学过Linux,很少用虚拟机(还是在大学的时候简单的用过),去配置openstack我想我入的坑肯定比有基础的一定要多,躺在每个坑中徘徊思索的时间 ...

  10. 页面嵌套frame,Selenium定位问题

    有时候,什么定位元素的方法都试过了,还是定位不到元素,就考虑frame切换问题 driver.switchTo().frame("定位到的frame元素"); //接下来就可以在这 ...