[解读REST] 1.REST的起源
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年至今10多年,随着越来越丰富富庞大的web,http1.1的性能问题越来越凸显出来。后来Google开发了一个SPDY协议,在TCP和HTTP之间增加了一层,重点在于提示传输性能和增加安全性,但是却强制了采用TLS。在后来制订了新版的http2,借鉴了SPDY中的一些经验,但是移除了对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
Evolution of HTTP:https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP
理解本真的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
架构风格与基于网络应用软件的架构设计(中文修订版):http://www.infoq.com/cn/minibooks/web-based-apps-archit-design
[解读REST] 1.REST的起源的更多相关文章
- [解读REST] 5.Web的需求 & 推导REST
衔接上文[解读REST] 4.基于网络应用的架构风格,上文总结了一些适用于基于网络应用的架构风格,以及其评估结果.在前文的基础上,本文介绍一下Web架构的需求,以及在对Web的关键协议进行设计和改进的 ...
- [解读REST] 2.REST用来干什么的?
衔接上文[解读REST] 1.REST的起源,介绍了REST的诞生背景.每当笔者遇到一个新事物的想去了解的时候,总是会问上自己第一个问题,这个新事物是干什么用的?在解释我所理解的REST这个过程中也不 ...
- Spring源码解读(一):Spring的背景起源及框架整体介绍
一.前言 Spring起源于2002年Rod Johnson写的一本书<Expert One-on-One J2EE>,书里介绍了Java企业应用程序开发情况,并指出Java EE和EJB ...
- scala(二) Future执行逻辑解读
在scala中是没有原生线程的,其底层使用的是java的Thread机制.但是在scala中对java Thread进行了封装,实现了更便于操作线程的Future. 官方文档: Futures pro ...
- 入口开始,解读Vue源码(一)-- 造物创世
Why? 网上现有的Vue源码解析文章一搜一大批,但是为什么我还要去做这样的事情呢?因为觉得纸上得来终觉浅,绝知此事要躬行. 然后平时的项目也主要是Vue,在使用Vue的过程中,也对其一些约定产生了一 ...
- 少侠学代码系列(一)->JS起源
少侠:喂,有人吗?赶紧出来接客了,有没有人啊 帅气的我:来了来了,少侠有何吩咐? 少侠:把你们店里的秘籍呈上来我要学JS 帅气的我:少侠,别这样,我们秘籍是不外传的,祖上传下来的规矩,传人妖不传男女. ...
- 网络结构解读之inception系列三:BN-Inception(Inception V2)
网络结构解读之inception系列三:BN-Inception(Inception V2) BN的出现大大解决了训练收敛问题.作者主要围绕归一化的操作做了一系列优化思路的阐述,值得细看. Batch ...
- SDWebImage源码解读之SDWebImageDownloaderOperation
第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...
- SDWebImage源码解读 之 NSData+ImageContentType
第一篇 前言 从今天开始,我将开启一段源码解读的旅途了.在这里先暂时不透露具体解读的源码到底是哪些?因为也可能随着解读的进行会更改计划.但能够肯定的是,这一系列之中肯定会有Swift版本的代码. 说说 ...
随机推荐
- C# 模拟网站登陆并截图
1.在窗体上加一个按钮,为按钮添加点击事件 private void button1_Click(object sender, EventArgs e) { Bitmap m_Bitmap = Web ...
- jQuery高级Ajax
.load();加载远程的HTML文件代码,并插入到指定的DOM节点中.可以只传入一个参数,表示加载一个静态的HTML代码片段. $("#div1").load("loa ...
- 团队作业6——展示博客(Alpha版本)
Deadline: 2017-5-7 22:00PM,以博客发表日期为准 评分基准: 按时交 - 有分,检查的项目包括后文的四个方面 团队成员介绍 Alpha阶段进展 团队合作,各成员分工 Beta阶 ...
- java--整理下关于static关键字的知识
如果将域定义为static,每个类中只有一个这样的域.而每一个对象对于所有的实例域却都有自己的一份拷贝.--<java核心技术> 使用static的两种情形:1.只想为某特定域分配单一存储 ...
- 201521123036 《Java程序设计》第2周学习总结
本周学习总结 java数据类型: 基本类型:整数,浮点,boolean类 引用类型:数组,类,接口,null类型 String类:String类的对象不可变,字符串API,大量修改字符串使用Strin ...
- 201521123106 《Java程序设计》第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前 ...
- eclipse : java项目中的web.xml( Deployment Descriptor 部署描述文件 )配置说明
context-param.listener.filter.servlet 首先可以肯定的是,加载顺序与它们在 web.xml 配置文件中的先后顺序无关.即不会因为 filter 写在 listen ...
- php memcache 扩展 php -m 与 phpinfo() 不同
事情起因,因要升级 openssl(openssl升级这里不表) ,所以在升级后对 php 也进行了从新编译,编译成功. 发现没有安装,memcache 扩展,从新编译安装了一下,显示的安装成功,但是 ...
- [LeetCode]Count and Say 计数和发言
Count and Say 计数和发言 思路:首先要理解题意,可以发现后者是在前者的基础之上进行的操作,所以我们拿之前的结果作为现在函数的参数循环n-1次即可,接下来就是统计字符串中相应字符的个数,需 ...
- 从content-type设置看Spring MVC处理header的一个坑
我们经常需要在HttpResponse中设置一些headers,我们使用Spring MVC框架的时候我们如何给Response设置Header呢? Sooooooooooooo easy, 看下面的 ...