[解讀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-area hypermedia 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,他和他的同事們在URI,HTTP1.0和HTTP/1.1協議的設計工作中,對于Web之所以取得巨大成功(同時面對早期HTTP0.9的糟糕設計),在技術架構方面的因素做了一番深入的分析和總結。Fielding將這些總結納入到了一套理論框架之中,然后使用這套理論框架中的指導原則,用來描述解釋Web的架構,以及用來指導這些協議的設計。HTTP/1.1協議的第一個草稿是在1996年1月發布的,經過了三年多時間的修訂,于1999年6月成為了IETF的正式規范。用來指導HTTP協議設計的這套理論框架,最初是以備忘錄的形式在專家組成員之間交流,除了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的一個架構實例。
本篇先開個頭,簡單介紹一下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:https://www.infoq.cn/article/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協議:https://www.infoq.cn/article/2012/07/roy-on-google-spdy
架構風格與基于網絡應用軟件的架構設計(中文修訂版):https://www.infoq.cn/article/web-based-apps-archit-design
Architectural Styles and the Design of Network-based Software Architectures:https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm
浙公網安備 33010602011771號