[解读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版本的代码. 说说 ...
随机推荐
- JAVA中String = null 与 String = "" 的区别
JAVA中String = null 与 String = ""的区别 笔者今天在Debug的时候发现的NPE(NullPointerException),辛辛苦苦地调试了半天,终 ...
- 个人作业(2)---英语学习APP案例分析
第一部分 调研, 评测 1.下载并使用,描述最简单直观的个人第一次上手体验. PC上的必应词典主页面与其他英语学习APP类似,一些英文读物的推送,但是每日阅读需要去浏览器去看有点不太方便,我觉得直接在 ...
- 201521123022 《Java程序设计》 第六周学习总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 2. 书面作业 Q1.clone方法 Q1.1 Objec ...
- 201521123028 《Java程序设计》第3周学习总结
1. 本周学习总结 2. 书面作业 Q1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; ...
- 201521123033《Java程序设计》第2周学习总结
1. 本周学习总结 answer:(1)学会用码云存储代码,并下载代码. (2)学会在java中使用函数,使代码更精炼. 2. 书面作业 Q1.使用Eclipse关联jdk源代码,并查看String对 ...
- 201521123113 《Java程序设计》第2周学习总结
1.本周学习总结 学习了各种java数据类型以及各种运算符的使用 string类之所以好用是因为这是人可以看得懂的类型,操作简便 Scanner扫描器与标准输出输入用法上的不同,Scanner较标准输 ...
- 201521123097《Java程序设计》第二周学习总结
1.本周学习总结 (1)学习了java的一些类型和变量. (2)学习了码云的部分功能的使用. 2.书面作业 使用Eclipse关联jdk源代码,并查看String对象的源代码. 为什么要尽量频繁的对字 ...
- 201521044091 《Java程序设计》第2周学习总结
1本章学习总结 (1)一些java的基本语法 (2)java API文件 (3)使用码云管理自己的代码 2.Java Q&A 1)使用Eclipse关联jdk源代码(截图),并查看String ...
- python 浅析模块
今天买了一本关于模块的书,说实话,模块真的太多了,小编许多也不知道,要是把模块全讲完,可能得出本书了,所以小编在自己有限的能力范围内在这里浅析一下自己的见解,同时讲讲几个常用的模块. 首先说一下对模块 ...
- 懒人小工具:自动生成Model,Insert,Select,Delete以及导出Excel的方法
在开发的过程中,我们为了节约时间,往往会将大量重复机械的代码封装,考虑代码的复用性,这样我们可以节约很多时间来做别的事情.最近跳槽到一节webform开发的公司,主要是开发自己公司用的ERP.开始因为 ...