【原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明原文章地址,謝謝!】
在上一篇文章中,我們從一個(gè)實(shí)際開(kāi)發(fā)中遇到的需求,對(duì)REST做了一個(gè)簡(jiǎn)單粗暴的介紹。在有了一些大概的理解之后,我們?cè)谶@篇文章中對(duì)REST的一些基本概念再進(jìn)行闡述。
先借用百度百科,對(duì)REST的來(lái)龍去脈做一個(gè)簡(jiǎn)單的介紹。
Web發(fā)展到了1995年,在CGI、ASP等技術(shù)出現(xiàn)之后,沿用了多年、主要面向靜態(tài)文檔的HTTP/1.0協(xié)議已經(jīng)無(wú)法滿(mǎn)足Web應(yīng)用的開(kāi)發(fā)需求,因此需要設(shè)計(jì)新版本的HTTP協(xié)議。在HTTP/1.0協(xié)議專(zhuān)家組之中,有一位年輕人脫穎而出,顯示出了不凡的洞察力,后來(lái)他成為了HTTP/1.1協(xié)議專(zhuān)家組的負(fù)責(zé)人。這位年輕人就是Apache HTTP服務(wù)器的核心開(kāi)發(fā)者Roy Fielding,他還是Apache軟件基金會(huì)的合作創(chuàng)始人。
Roy Fielding和他的同事們?cè)贖TTP/1.1協(xié)議的設(shè)計(jì)工作中,對(duì)于Web之所以取得巨大成功,在技術(shù)架構(gòu)方面的因素做了一番深入的總結(jié)。Fielding將這些總結(jié)納入到了一套理論框架之中,然后使用這套理論框架中的指導(dǎo)原則,來(lái)指導(dǎo)HTTP/1.1協(xié)議的設(shè)計(jì)方向。HTTP/1.1協(xié)議的第一個(gè)草稿是在1996年1月發(fā)布的,經(jīng)過(guò)了三年多時(shí)間的修訂,于1999年6月成為了IETF的正式規(guī)范(包括了RFC 2616以及用于對(duì)客戶(hù)端做身份認(rèn)證的RFC 2617)。HTTP/1.1協(xié)議設(shè)計(jì)的極為成功,以至于發(fā)布之后整整10年時(shí)間里,都沒(méi)有多少人認(rèn)為有修訂的必要。用來(lái)指導(dǎo)HTTP/1.1協(xié)議設(shè)計(jì)的這套理論框架,最初是以備忘錄的形式在專(zhuān)家組成員之間交流,除了IETF/W3C的專(zhuān)家圈子,并沒(méi)有在外界廣泛流傳。Fielding在完成HTTP/1.1協(xié)議的設(shè)計(jì)工作之后,回到了加州大學(xué)歐文分校繼續(xù)攻讀自己的博士學(xué)位。第二年(2000年)在他的博士學(xué)位論文Architectural Styles and the Design of Network-based Software Architectures中,F(xiàn)ielding更為系統(tǒng)、嚴(yán)謹(jǐn)?shù)仃U述了這套理論框架,并且使用這套理論框架推導(dǎo)出了一種新的架構(gòu)風(fēng)格,并且為這種架構(gòu)風(fēng)格取了一個(gè)令人輕松愉快的名字“REST”——Resource Representational State Transfer(表述性狀態(tài)轉(zhuǎn)移)的縮寫(xiě)。
所以,講到REST架構(gòu),不得不提一下Architectural Styles and the Design of Network-based Software Architectures這篇論文,而另一個(gè)概念,即REST架構(gòu)是高于HTTP/1.1協(xié)議的,HTTP/1.1協(xié)議只是REST架構(gòu)的一種實(shí)現(xiàn)方式。所以我們?cè)谏掀恼轮?,才?huì)看到,REST相關(guān)的內(nèi)容在HTTP協(xié)議中都可以找到對(duì)應(yīng)的概念,比如請(qǐng)求方式,比如請(qǐng)求頭等等。
而實(shí)現(xiàn)了REST架構(gòu)的應(yīng)用,或者叫遵循了REST架構(gòu)的應(yīng)用,我們就叫做RESTful。
概念闡述
下面針對(duì)REST中的重要概念做一個(gè)簡(jiǎn)單的闡述,比較理論。
Resource
所謂"資源",就是網(wǎng)絡(luò)上的一個(gè)實(shí)體,或者說(shuō)是網(wǎng)絡(luò)上的一個(gè)具體信息。它可以是一段文本、一張圖片、一首歌曲、一種服務(wù),總之就是一個(gè)具體的實(shí)在。你可以用一個(gè)URI(統(tǒng)一資源定位符)指向它,每種資源對(duì)應(yīng)一個(gè)特定的URI。要獲取這個(gè)資源,訪(fǎng)問(wèn)它的URI就可以,因此URI就成了每一個(gè)資源的地址或獨(dú)一無(wú)二的識(shí)別符。但是注意資源都是名詞,所以才有上篇文章中的http://classes.wolfcode.cn/coupons這樣的資源URI存在;
Representation
"資源"是一種信息實(shí)體,它可以有多種外在表現(xiàn)形式。我們把"資源"具體呈現(xiàn)出來(lái)的形式,叫做它的"表現(xiàn)層"(Representation)。
比如,文本可以用txt格式表現(xiàn),也可以用HTML格式、XML格式、JSON格式表現(xiàn),甚至可以采用二進(jìn)制格式;圖片可以用JPG格式表現(xiàn),也可以用PNG格式表現(xiàn)。
URI只代表資源的實(shí)體,不代表它的形式。嚴(yán)格地說(shuō),有些網(wǎng)址最后的".html"后綴名是不必要的,因?yàn)檫@個(gè)后綴名表示格式,屬于"表現(xiàn)層"范疇,而URI應(yīng)該只代表"資源"的位置。它的具體表現(xiàn)形式,應(yīng)該在HTTP請(qǐng)求的頭信息中用Accept和Content-Type字段指定,這兩個(gè)字段才是對(duì)"表現(xiàn)層"的描述。
State Transfer
訪(fǎng)問(wèn)一個(gè)網(wǎng)站,就代表了客戶(hù)端和服務(wù)器的一個(gè)互動(dòng)過(guò)程。在這個(gè)過(guò)程中,勢(shì)必涉及到數(shù)據(jù)和狀態(tài)的變化。
互聯(lián)網(wǎng)通信協(xié)議HTTP協(xié)議,是一個(gè)無(wú)狀態(tài)協(xié)議。這意味著,所有的狀態(tài)都保存在服務(wù)器端。因此,如果客戶(hù)端想要操作服務(wù)器,必須通過(guò)某種手段,讓服務(wù)器端發(fā)生"狀態(tài)轉(zhuǎn)化"(State Transfer)。而這種轉(zhuǎn)化是建立在表現(xiàn)層之上的(因?yàn)镻OST,GET等請(qǐng)求方式屬于表現(xiàn)層內(nèi)容,同理Accept type請(qǐng)求頭也屬于表現(xiàn)層內(nèi)容),所以就是"表現(xiàn)層狀態(tài)轉(zhuǎn)化"。
Uniform Interface
為了讓表現(xiàn)層能夠按照一個(gè)統(tǒng)一的模式去促使服務(wù)端資源狀態(tài)的變化,在HTTP/1.1協(xié)議中給應(yīng)用提供了統(tǒng)一的接口。包括請(qǐng)求方式,請(qǐng)求頭,響應(yīng)頭,等等。
以HTTP1.1協(xié)議為例:
- 提供了7個(gè)HTTP方法:GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS
- 提供了HTTP頭信息(可自定義)
- HTTP響應(yīng)狀態(tài)代碼(可自定義)
這些就是HTTP1.1協(xié)議提供的統(tǒng)一接口。此外,REST還要求,對(duì)于資源執(zhí)行的操作,其操作語(yǔ)義必須由HTTP消息體之前的部分完全表達(dá),不能將操作語(yǔ)義封裝在HTTP消息體內(nèi)部。
縮小范圍
在本系列文章中,我們只把關(guān)注點(diǎn)聚焦于應(yīng)用接口這塊。使用RESTful來(lái)完成應(yīng)用接口的開(kāi)發(fā)。
很多情況下,我們需要把系統(tǒng)的功能作為服務(wù)暴露給外部的其他應(yīng)用使用或者給移動(dòng)端使用,就需要把系統(tǒng)中的服務(wù)作為接口暴露出去,一般分為公共接口和私用接口;對(duì)內(nèi)的接口一般就是內(nèi)部系統(tǒng)之間的服務(wù)的相互調(diào)用,比如商城平臺(tái)中,訂單系統(tǒng)和倉(cāng)儲(chǔ)系統(tǒng)之間需要多種接口來(lái)處理業(yè)務(wù)關(guān)系,那么這種接口,一般常用的方法,可以使用RPC,RMI,WebService等等,都是可以的。而對(duì)外的接口,比如應(yīng)用提供給App端應(yīng)用的接口,一般更多使用普通HTTP請(qǐng)求或者RESTful架構(gòu)。
在本系列文章中,我們就把焦點(diǎn)集中在RESTful在對(duì)外接口這塊需求上。
小結(jié)
通過(guò)上面的解釋?zhuān)覀兒?jiǎn)單的了解了HTTP/1.1和REST之間的關(guān)系,了解了REST架構(gòu)中一些重要概念的理論解釋?zhuān)乱黄恼挛覀冎攸c(diǎn)姜維放在HTTP/1.1協(xié)議給我們提供的統(tǒng)一接口上。
