什么是REST
全拼:Representational State Transfer徽诲,中文直譯就是,要理解RESTful吵血,首先得知道什么是REST谎替。
REST其實(shí)是一組架構(gòu)約束條件和原則,所以蹋辅,它首先是需要在符合架構(gòu)原理的前提下的一組原則钱贯,再者,其以網(wǎng)絡(luò)為基礎(chǔ)侦另,所以其充分利用了web的約束條件與原則秩命,其本身就受Web技術(shù)的影響很深。
那么RESTful呢褒傅?一個(gè)架構(gòu)如果符合REST的約束條件和原則弃锐,我們就稱它為RESTful架構(gòu)
理論上REST架構(gòu)風(fēng)格并不是綁定在HTTP上,只不過目前HTTP是唯一與REST相關(guān)的實(shí)例殿托。所以這里描述的REST也是通過HTTP實(shí)現(xiàn)的REST
那什么是REST原則與約束
一般都會有5個(gè)關(guān)鍵的概念:
資源與URI
資源拿愧,這里涉及了REST的第一個(gè)關(guān)鍵詞R(Representational)。任何事物(具體或抽象都可)碌尔,只要有被引用到的必要浇辜,它就是一個(gè)資源。
比如:
- 電話號碼
- 用戶套餐
- 物品價(jià)值
要讓一個(gè)資源可以被識別唾戚,需要有個(gè)唯一標(biāo)識柳洋,在Web中這個(gè)唯一標(biāo)識就是URI(Uniform Resource Identifier)。
URI既可以看成是資源的地址叹坦,也可以看成是資源的名稱熊镣。如果某些信息沒有使用URI來表示,那它就不能算是一個(gè)資源, 只能算是資源的一些信息而已绪囱。URI的設(shè)計(jì)應(yīng)該遵循可尋址性原則测蹲,具有自描述性,需要在形式上給人以直覺上的關(guān)聯(lián)鬼吵,這里就涉及了URI的設(shè)計(jì)技巧扣甲。
URI設(shè)計(jì)技巧:
使用_或-替換數(shù)字,使其具有更好的可讀性
使用/來表示資源的層級關(guān)系
-
使用?用來過濾資源
有開發(fā)經(jīng)驗(yàn)的可能想齿椅?后面的應(yīng)該是參數(shù)傳遞才對琉挖,但更好的理解應(yīng)該是對資源的過濾
使用“,或;”表示同級關(guān)系
統(tǒng)一資源接口
標(biāo)準(zhǔn)的HTTP的GET,DELETE涣脚,PUT和POST示辈;一般默認(rèn)地對應(yīng)“查、刪遣蚀、改矾麻、增”。另外還有HEAD和OPTIONS芭梯。
按照HTTP方法的語義來暴露資源险耀,那么接口將會擁有安全性和冪等性的特性,例如GET和HEAD請求都是安全的粥帚, 無論請求多少次,都不會改變服務(wù)器狀態(tài)限次。而GET芒涡、HEAD、PUT和DELETE請求都是冪等的卖漫,無論對資源操作多少次费尽, 結(jié)果總是一樣的,后面的請求并不會產(chǎn)生比第一次更多的影響
資源的表述與多重表述
客戶端通過HTTP方法可以獲取資源羊始,是吧? 不旱幼,確切的說,客戶端獲取的只是資源的表述而已突委。資源可以有多種表述形式柏卤,如文本資源可以使用json、xml等匀油,圖片可以為jpg缘缚、png等。而客戶端與服務(wù)端需要通過一種機(jī)制協(xié)商資源的表述形式敌蚜,那就是客戶端可以通過Accept頭請求一種特定格式的表述桥滨,服務(wù)端則通過Content-Type告訴客戶端資源的表述形式
在http中,content-type一共有3鐘:
-
text/*
*可為text/json/xml/html,其中不含任何控件或格式字符
-
multipart/form-data
數(shù)據(jù)被編碼為一條消息齐媒,頁上的每個(gè)控件對應(yīng)消息中的一個(gè)部分
-
application/x-www-form-urlencoded
數(shù)據(jù)被編碼為名稱/值對
URL:如果我們把版本號理解成資源的不同表述形式的話蒲每,就應(yīng)該只是用一個(gè)URL,并通過Accept頭部來區(qū)分
資源的鏈接
當(dāng)你瀏覽Web網(wǎng)頁時(shí)喻括,從一個(gè)連接跳到一個(gè)頁面邀杏,再從另一個(gè)連接跳到另外一個(gè)頁面,這其實(shí)就是超媒體的概念:把一個(gè)個(gè)把資源鏈接起來(這其實(shí)是構(gòu)成動態(tài)應(yīng)用的一種有效方式)双妨,類似于頁面中各種a標(biāo)簽
無狀態(tài)通信or狀態(tài)的轉(zhuǎn)移
注意了淮阐,無狀態(tài)通信——并不是說客戶端應(yīng)用不能有狀態(tài),而是指服務(wù)端不應(yīng)該保存客戶端狀態(tài)刁品。
狀態(tài)應(yīng)該區(qū)分應(yīng)用狀態(tài)和資源狀態(tài)泣特,客戶端負(fù)責(zé)維護(hù)應(yīng)用狀態(tài),而服務(wù)端維護(hù)資源狀態(tài)挑随。REST要求狀態(tài)要么被放入資源狀態(tài)中状您,要么保存在客戶端上;換句話說兜挨,服務(wù)器端不能保持除了單次請求之外的膏孟,任何與其通信的客戶端的通信狀態(tài)。這樣做的最直接的理由就是可伸縮性—— 如果服務(wù)器需要保持客戶端狀態(tài)拌汇,那么大量的客戶端交互會嚴(yán)重影響服務(wù)器的內(nèi)存可用空間柒桑。服務(wù)端不需要在請求間保留應(yīng)用狀態(tài),只有在接受到實(shí)際請求的時(shí)候噪舀,服務(wù)端才會關(guān)注應(yīng)用狀態(tài)魁淳。
無狀態(tài)約束使服務(wù)器的變化對客戶端是不可見的,因?yàn)樵趦纱芜B續(xù)的請求中与倡,客戶端并不依賴于同一臺服務(wù)器界逛。
這種無狀態(tài)通信原則,使得服務(wù)端和中介能夠理解獨(dú)立的請求和響應(yīng)纺座。
"會話"狀態(tài)不是作為資源狀態(tài)保存在服務(wù)端的息拜,而是被客戶端作為應(yīng)用狀態(tài)進(jìn)行跟蹤的【幌欤客戶端應(yīng)用狀態(tài)在服務(wù)端提供的超媒體的指引下發(fā)生變遷少欺,服務(wù)端通過超媒體(其實(shí)就是資源的鏈接)告訴客戶端當(dāng)前狀態(tài)有哪些后續(xù)狀態(tài)可以進(jìn)入。這也就是狀態(tài)的轉(zhuǎn)移過程馋贤。
參考:
http://www.runoob.com/w3cnote/restful-architecture.html
http://www.infoq.com/cn/articles/rest-introduction/