解釋一
REST -- REpresentational State Transfer 直接翻譯:表現(xiàn)層狀態(tài)轉(zhuǎn)移。這個(gè)中文直譯經(jīng)常出現(xiàn)在很多博客中。尼瑪誰聽得懂“表現(xiàn)層狀態(tài)轉(zhuǎn)移”?這是人話嗎习寸?我自己也困惑了很久,查詢了很多資料,花了差不多一年有個(gè)還算清晰的理解感憾。
URL定位資源,用HTTP動(dòng)詞(GET,POST,DELETE,DETC)描述操作
HTTP協(xié)議(HyperText Transfer Protocol令花,超文本傳輸協(xié)議)是用于從WWW服務(wù)器傳輸超文本到本地瀏覽器的傳輸協(xié)議阻桅。它可以使瀏覽器更加高效,使網(wǎng)絡(luò)傳輸減少兼都。它不僅保證計(jì)算機(jī)正確快速地傳輸超文本文檔嫂沉,還確定傳輸文檔中的哪一部分,以及哪部分內(nèi)容首先顯示(如文本先于圖形)等扮碧。
0. REST不是"rest"這個(gè)單詞趟章,而是幾個(gè)單詞縮寫。但即使那幾個(gè)單詞說出來慎王,也無法理解在說什么 -_-!! (不是要貶低人蚓土,是我自己也理解困難);
1. REST描述的是在網(wǎng)絡(luò)中client和server的一種交互形式赖淤;REST本身不實(shí)用蜀漆,實(shí)用的是如何設(shè)計(jì) RESTful API(REST風(fēng)格的網(wǎng)絡(luò)接口);
2. Server提供的RESTful API中咱旱,URL中只使用名詞來指定資源确丢,原則上不使用動(dòng)詞∶Ч辏“資源”是REST架構(gòu)或者說整個(gè)網(wǎng)絡(luò)處理的核心蠕嫁。比如:
[http://api.qc.com/v1/newsfeed]: 獲取某人的新鮮;
[http://api.qc.com/v1/friends] : 獲取某人的好友列表;
[http://api.qc.com/v1/profile] : 獲取某人的詳細(xì)信息;
3. 用HTTP協(xié)議里的動(dòng)詞來實(shí)現(xiàn)資源的添加,修改毯盈,刪除等操作剃毒。即通過HTTP動(dòng)詞來實(shí)現(xiàn)資源的狀態(tài)扭轉(zhuǎn):
GET 用來獲取資源,
POST 用來新建資源(也可以用于更新資源),
PUT 用來更新資源赘阀,
DELETE 用來刪除資源益缠。比如:
DELETE http://api.qc.com/v1/friends: 刪除某人的好友 (在http parameter指定好友id)
POST http://api.qc.com/v1/friends: 添加好友
UPDATE http://api.qc.com/v1/profile : 更新個(gè)人資料
Server和Client之間傳遞某資源的一個(gè)表現(xiàn)形式,比如用JSON基公,XML傳輸文本幅慌,或者用JPG,WebP傳輸圖片等轰豆。當(dāng)然還可以壓縮HTTP傳輸時(shí)的數(shù)據(jù)(on-wire data compression)胰伍。
-
用 HTTP Status Code傳遞Server的狀態(tài)信息。比如最常用的 200 表示成功酸休,500 表示Server內(nèi)部錯(cuò)誤等骂租。主要信息就這么點(diǎn)。最后是要解放思想斑司,Web端不再用之前典型的PHP或JSP架構(gòu)渗饮,而是改為前段渲染和附帶處理簡單的商務(wù)邏輯(比如AngularJS或者BackBone的一些樣例)。Web端和Server只使用上述定義的API來傳遞數(shù)據(jù)和改變數(shù)據(jù)狀態(tài)宿刮。格式一般是JSON互站。iOS和Android同理可得。由此可見僵缺,Web胡桃,iOS,Android和第三方開發(fā)者變?yōu)槠降鹊慕巧ㄟ^一套API來共同消費(fèi)Server提供的服務(wù)谤饭。
解釋二
看Url就知道要什么
看http method就知道干什么
看http status code就知道結(jié)果如何
解釋三
要解釋什么是REST标捺,你應(yīng)該先了解什么是API(Application Programming Interface,應(yīng)用程序編程接口),形象一點(diǎn)說就是像一個(gè)公司比如騰訊揉抵,阿里巴巴之類亡容,他們可以提供一個(gè)API,然后我們或者一些其他的小公司可以編一個(gè)軟件去跟這個(gè)接口(API)進(jìn)行相連或交互冤今。舉個(gè)例子闺兢,比如你可以用手機(jī)的其他軟件分享內(nèi)容到微信朋友圈或者新浪微博,這些軟件就是與微信和微博的api進(jìn)行了交互戏罢。
知道了API屋谭,那么就容易理解REST了。REST是什么呢龟糕? 它是一種架構(gòu)風(fēng)格桐磁,騰訊公司或其他公司建立API時(shí)要遵守的一種規(guī)則/風(fēng)格,當(dāng)然也有其他規(guī)則可以用讲岁。
現(xiàn)在稍微具體一下什么是REST架構(gòu)風(fēng)格我擂。REST也就是Representational State Transfer(表現(xiàn)層狀態(tài)轉(zhuǎn)移)衬以。要具體什么事REST,我們又必須提到Web(大神請忽略這里校摩,因?yàn)槲疫@篇是想帶0基礎(chǔ)的人入門的)看峻,因?yàn)镽EST是以Web為平臺的。
Web是什么: 分布式信息系統(tǒng)為超文本文件和其他對象(資源)提供訪問入口
資源是Web架構(gòu)的關(guān)鍵點(diǎn),需要 3個(gè)操作 識別(identify) 表示(represent) 交互(interact with),通過這三個(gè)操作衙吩,又引出三個(gè)概念uri(統(tǒng)一資源標(biāo)識符包括url和urn)識別資源互妓;representation (例如html,xml坤塞,圖片冯勉,視頻等等)表示資源;通過協(xié)議(包括http尺锚,ftp等等)與資源進(jìn)行交互
所以REST就是選擇通過使用http協(xié)議和uri珠闰,利用client/server model對資源進(jìn)行CRUD (Create/Read/Update/Delete)增刪改查操作。
那么為什么要使用REST風(fēng)格呢瘫辩?肯定是因?yàn)樗膬?yōu)點(diǎn),所以才選擇使用它呀坛悉。因此現(xiàn)在先介紹它的優(yōu)點(diǎn)伐厌,
要介紹它的優(yōu)點(diǎn)又要提到它的六個(gè)限制(約束),我看其他答案只提到了限制裸影,但是沒有寫限制的好處挣轨,在這里我列出限制和它的好處:
1.客戶-服務(wù)器(Client-Server)客戶端服務(wù)器分離
優(yōu)點(diǎn),提高用戶界面的便攜性(操作簡單)
通過簡化服務(wù)器提高可伸縮性(高性能轩猩,低成本)
允許組件分別優(yōu)化(可以讓服務(wù)端和客戶端分別進(jìn)行改進(jìn)和優(yōu)化)
2.無狀態(tài)(Stateless)
從客戶端的每個(gè)請求要包含服務(wù)器所需要的所有信息
優(yōu)點(diǎn):
提高可見性(可以單獨(dú)考慮每個(gè)請求)
提高了可靠性(更容易從局部故障中修復(fù))
提高可擴(kuò)展性(降低了服務(wù)器資源使用)
3.緩存(Cachable)
服務(wù)器返回信息必須被標(biāo)記是否可以緩存卷扮,如果緩存,客戶端可能會(huì)重用之前的信息發(fā)送請求均践。
優(yōu)點(diǎn):
減少交互次數(shù)
減少交互的平均延遲
4.分層系統(tǒng)(Layered System)
系統(tǒng)組件不需要知道與他交流組件之外的事情晤锹。封裝服務(wù),引入中間層彤委。
優(yōu)點(diǎn):
限制了系統(tǒng)的復(fù)雜性
提高可擴(kuò)展性
5.統(tǒng)一接口(Uniform Interface)
優(yōu)點(diǎn):
提高交互的可見性
鼓勵(lì)單獨(dú)改善組件
6.支持按需代碼(Code-On-Demand 可選)
優(yōu)點(diǎn):
提高可擴(kuò)展性
解釋四
1. RESTful架構(gòu)風(fēng)格
RESTful架構(gòu)風(fēng)格最初由Roy T. Fielding(HTTP/1.1協(xié)議專家組負(fù)責(zé)人)在其2000年的博士學(xué)位論文中提出鞭铆。HTTP就是該架構(gòu)風(fēng)格的一個(gè)典型應(yīng)用。從其誕生之日開始疗琉,它就因其可擴(kuò)展性和簡單性受到越來越多的架構(gòu)師和開發(fā)者們的青睞薄嫡。一方面浊吏,隨著云計(jì)算和移動(dòng)計(jì)算的興起,許多企業(yè)愿意在互聯(lián)網(wǎng)上共享自己的數(shù)據(jù)舶担、功能;另一方面彬呻,在企業(yè)中衣陶,RESTful API(也稱RESTful Web服務(wù))也逐漸超越SOAP成為實(shí)現(xiàn)SOA的重要手段之一柄瑰。時(shí)至今日,RESTful架構(gòu)風(fēng)格已成為企業(yè)級服務(wù)的標(biāo)配祖搓。
REST即Representational State Transfer的縮寫狱意,可譯為"表現(xiàn)層狀態(tài)轉(zhuǎn)化”详囤。REST最大的幾個(gè)特點(diǎn)為:資源、統(tǒng)一接口、URI和無狀態(tài)。
1.1 RESTful架構(gòu)風(fēng)格的特點(diǎn)
1.1.1 資源
所謂"資源",就是網(wǎng)絡(luò)上的一個(gè)實(shí)體举庶,或者說是網(wǎng)絡(luò)上的一個(gè)具體信息。它可以是一段文本蕊唐、一張圖片署尤、一首歌曲俗扇、一種服務(wù),總之就是一個(gè)具體的實(shí)在。資源總要通過某種載體反應(yīng)其內(nèi)容,文本可以用txt格式表現(xiàn)护蝶,也可以用HTML格式负饲、XML格式表現(xiàn),甚至可以采用二進(jìn)制格式赏表;圖片可以用JPG格式表現(xiàn),也可以用PNG格式表現(xiàn)瓢剿;JSON是現(xiàn)在最常用的資源表示格式逢慌。
結(jié)合我的開發(fā)實(shí)踐,我對資源和數(shù)據(jù)理解如下:
資源是以json(或其他Representation)為載體的间狂、面向用戶的一組數(shù)據(jù)集攻泼,資源對信息的表達(dá)傾向于概念模型中的數(shù)據(jù):
1??資源總是以某種Representation為載體顯示的,即序列化的信息
2??常用的Representation是json(推薦)或者xml(不推薦)等
3??Representation 是REST架構(gòu)的表現(xiàn)層
相對而言鉴象,數(shù)據(jù)(尤其是數(shù)據(jù)庫)是一種更加抽象的忙菠、對計(jì)算機(jī)更高效和友好的數(shù)據(jù)表現(xiàn)形式,更多的存在于邏輯模型中
1.1.2 統(tǒng)一接口
RESTful架構(gòu)風(fēng)格規(guī)定纺弊,數(shù)據(jù)的元操作牛欢,即CRUD(create, read, update和delete,即數(shù)據(jù)的增刪查改)操作,分別對應(yīng)于HTTP方法:GET用來獲取資源淆游,POST用來新建資源(也可以用于更新資源)傍睹,PUT用來更新資源隔盛,DELETE用來刪除資源,這樣就統(tǒng)一了數(shù)據(jù)操作的接口拾稳,僅通過HTTP方法吮炕,就可以完成對數(shù)據(jù)的所有增刪查改工作。
即:
GET(SELECT):從服務(wù)器取出資源(一項(xiàng)或多項(xiàng))访得。
POST(CREATE):在服務(wù)器新建一個(gè)資源龙亲。
PUT(UPDATE):在服務(wù)器更新資源(客戶端提供完整資源數(shù)據(jù))。
PATCH(UPDATE):在服務(wù)器更新資源(客戶端提供需要修改的資源數(shù)據(jù))震鹉。
DELETE(DELETE):從服務(wù)器刪除資源
1.1.3 URI
可以用一個(gè)URI(統(tǒng)一資源定位符Uniform Resource Identifier )指向資源俱笛,即每個(gè)URI都對應(yīng)一個(gè)特定的資源。要獲取這個(gè)資源传趾,訪問它的URI就可以迎膜,因此URI就成了每一個(gè)資源的地址或識別符。
一般的浆兰,每個(gè)資源至少有一個(gè)URI與之對應(yīng)磕仅,最典型的URI即URL。
1.1.4 無狀態(tài)
所謂無狀態(tài)的簸呈,即所有的資源榕订,都可以通過URI定位,而且這個(gè)定位與其他資源無關(guān)蜕便,也不會(huì)因?yàn)槠渌Y源的變化而改變劫恒。有狀態(tài)和無狀態(tài)的區(qū)別,舉個(gè)簡單的例子說明一下轿腺。如查詢員工的工資两嘴,如果查詢工資是需要登錄系統(tǒng),進(jìn)入查詢工資的頁面族壳,執(zhí)行相關(guān)操作后憔辫,獲取工資的多少,則這種情況是有狀態(tài)的仿荆,因?yàn)椴樵児べY的每一步操作都依賴于前一步操作贰您,只要前置操作不成功,后續(xù)操作就無法執(zhí)行拢操;如果輸入一個(gè)url即可得到指定員工的工資锦亦,則這種情況是無狀態(tài)的,因?yàn)楂@取工資不依賴于其他資源或狀態(tài)庐冯,且這種情況下孽亲,員工工資是一個(gè)資源,由一個(gè)url與之對應(yīng)展父,可以通過HTTP中的GET方法得到資源返劲,這是典型的RESTful風(fēng)格玲昧。
1.2 ROA、SOA篮绿、REST與RPC
ROA即Resource Oriented Architecture孵延,RESTful 架構(gòu)風(fēng)格的服務(wù)是圍繞資源展開的,是典型的ROA架構(gòu)(雖然“A”和“架構(gòu)”存在重復(fù)亲配,但說無妨)尘应,雖然ROA與SOA并不沖突,甚至把ROA看做SOA的一種也未嘗不可吼虎,但由于RPC也是SOA犬钢,比較久遠(yuǎn)一點(diǎn)點(diǎn)論文、博客或圖書也常把SOA與RPC混在一起討論思灰,因此玷犹,RESTful 架構(gòu)風(fēng)格的服務(wù)通常被稱之為ROA架構(gòu),很少提及SOA架構(gòu)洒疚,以便更加顯式的與RPC區(qū)分歹颓。
RPC風(fēng)格曾是Web Service的主流,最初是基于XML-RPC協(xié)議(一個(gè)遠(yuǎn)程過程調(diào)用(remote procedure call油湖,RPC)的分布式計(jì)算協(xié)議)巍扛,后來漸漸被SOAP協(xié)議(簡單對象訪問協(xié)議(Simple Object Access Protocol))取代;RPC風(fēng)格的服務(wù)乏德,不僅可以用HTTP撤奸,還可以用TCP或其他通信協(xié)議。但RPC風(fēng)格的服務(wù)喊括,受開發(fā)服務(wù)采用語言的束縛比較大寂呛,如.NET框架中,開發(fā)web service的傳統(tǒng)方式是使用WCF瘾晃,基于WCF開發(fā)的服務(wù)即RPC風(fēng)格的服務(wù),使用該服務(wù)的客戶端通常要用C#來實(shí)現(xiàn)幻妓,如果使用python或其他語言蹦误,很難實(shí)現(xiàn)可以直接與服務(wù)通信客戶端;進(jìn)入移動(dòng)互聯(lián)網(wǎng)時(shí)代后肉津,RPC風(fēng)格的服務(wù)很難在移動(dòng)終端使用强胰,而RESTful風(fēng)格的服務(wù),由于可以直接以json或xml為載體承載數(shù)據(jù)妹沙,以HTTP方法為統(tǒng)一接口完成數(shù)據(jù)操作偶洋,客戶端的開發(fā)不依賴于服務(wù)實(shí)現(xiàn)的技術(shù),移動(dòng)終端也可以輕松使用服務(wù)距糖,這也加劇了REST取代RPC成為web service的主導(dǎo)玄窝。
RPC與RESTful的區(qū)別如下面兩個(gè)圖所示:
1.3 本真REST與hybrid風(fēng)格
通常開發(fā)者做服務(wù)相關(guān)的客戶端開發(fā)時(shí)牵寺,使用的所謂RESTful服務(wù),基本可分為本真REST和hybrid風(fēng)格兩類恩脂。本真REST即我上文闡述的RESTful架構(gòu)風(fēng)格帽氓,具有上述的4個(gè)特點(diǎn),是真正意義上的RESTful風(fēng)格俩块;而hybrid風(fēng)格黎休,只是借鑒了RESTful的一些優(yōu)點(diǎn),具有一部分RESTful的特點(diǎn)玉凯,但對外依然宣稱是RESTful風(fēng)格的服務(wù)势腮。(竊以為,正是由于hybrid風(fēng)格服務(wù)混淆了RESTful的概念漫仆,才在RESTful架構(gòu)風(fēng)格提出了本真REST的概念捎拯,以為了劃分界限 :P)
hybrid風(fēng)格的最主流的用法是,使用GET方法獲取資源歹啼,用POST方法實(shí)現(xiàn)資源的創(chuàng)建玄渗、修改和刪除。hybrid風(fēng)格之所以存在狸眼,據(jù)我了解有兩種來源:一種情況是因?yàn)樘偈鳎承╅_發(fā)者并沒有真正理解何為RESTful架構(gòu)風(fēng)格,導(dǎo)致開發(fā)的服務(wù)貌合神離拓萌;而主流的原因是由于歷史包袱 —— 服務(wù)本來是RPC風(fēng)格的岁钓,由于上文提到的RPC的劣勢及RESTful的優(yōu)勢,開發(fā)者在RPC風(fēng)格的服務(wù)上又包裝了一層RESTful的外殼微王,通常這層外殼只為獲取資源服務(wù)屡限,因此會(huì)按RESTful風(fēng)格實(shí)現(xiàn)GET方法,如果客戶端提出一些簡單的創(chuàng)建炕倘、修改或刪除數(shù)據(jù)的需求钧大,則通過HTTP協(xié)議中最常用的POST方法實(shí)現(xiàn)相應(yīng)功能。
因此罩旋,開發(fā)RESTful 服務(wù)啊央,如果沒有歷史包袱,不建議使用hybrid風(fēng)格涨醋。
2.認(rèn)證機(jī)制
由于RESTful風(fēng)格的服務(wù)是無狀態(tài)的瓜饥,認(rèn)證機(jī)制尤為重要。例如上文提到的員工工資浴骂,這應(yīng)該是一個(gè)隱私資源乓土,只有員工本人或其他少數(shù)有權(quán)限的人有資格看到,如果不通過權(quán)限認(rèn)證機(jī)制對資源做一層限制,那么所有資源都以公開方式暴露出來趣苏,這是不合理的狡相,也是很危險(xiǎn)的。
認(rèn)證機(jī)制解決的問題是拦键,確定訪問資源的用戶是誰谣光;權(quán)限機(jī)制解決的問題是,確定用戶是否被許可使用芬为、修改萄金、刪除或創(chuàng)建資源。權(quán)限機(jī)制通常與服務(wù)的業(yè)務(wù)邏輯綁定媚朦,因此權(quán)限機(jī)制需要在每個(gè)系統(tǒng)內(nèi)部定制氧敢,而認(rèn)證機(jī)制基本上是通用的,常用的認(rèn)證機(jī)制包括 session auth(即通過用戶名密碼登錄)询张,basic auth孙乖,token auth和OAuth,服務(wù)開發(fā)中常用的認(rèn)證機(jī)制為后三者份氧。
2.1 Basic Auth
簡言之唯袄,Basic Auth是配合RESTful API 使用的最簡單的認(rèn)證方式,只需提供用戶名密碼即可蜗帜,但由于有把用戶名密碼暴露給第三方客戶端的風(fēng)險(xiǎn)恋拷,在生產(chǎn)環(huán)境下被使用的越來越少。因此厅缺,在開發(fā)對外開放的RESTful API時(shí)蔬顾,盡量避免采用Basic Auth
2.2 Token Auth
Token Auth并不常用,它與Basic Auth的區(qū)別是湘捎,不將用戶名和密碼發(fā)送給服務(wù)器做用戶認(rèn)證诀豁,而是向服務(wù)器發(fā)送一個(gè)事先在服務(wù)器端生成的token來做認(rèn)證。因此Token Auth要求服務(wù)器端要具備一套完整的Token創(chuàng)建和管理機(jī)制窥妇,該機(jī)制的實(shí)現(xiàn)會(huì)增加大量且非必須的服務(wù)器端開發(fā)工作舷胜,也不見得這套機(jī)制足夠安全和通用,因此Token Auth用的并不多活翩。
2.3 OAuth
OAuth(開放授權(quán))是一個(gè)開放的授權(quán)標(biāo)準(zhǔn)逞带,允許用戶讓第三方應(yīng)用訪問該用戶在某一web服務(wù)上存儲(chǔ)的私密的資源(如照片,視頻纱新,聯(lián)系人列表),而無需將用戶名和密碼提供給第三方應(yīng)用穆趴。
OAuth允許用戶提供一個(gè)令牌脸爱,而不是用戶名和密碼來訪問他們存放在特定服務(wù)提供者的數(shù)據(jù)。每一個(gè)令牌授權(quán)一個(gè)特定的第三方系統(tǒng)(例如未妹,視頻編輯網(wǎng)站)在特定的時(shí)段(例如簿废,接下來的2小時(shí)內(nèi))內(nèi)訪問特定的資源(例如僅僅是某一相冊中的視頻)空入。這樣,OAuth讓用戶可以授權(quán)第三方網(wǎng)站訪問他們存儲(chǔ)在另外服務(wù)提供者的某些特定信息族檬,而非所有內(nèi)容歪赢。
正是由于OAUTH的嚴(yán)謹(jǐn)性和安全性,現(xiàn)在OAUTH已成為RESTful架構(gòu)風(fēng)格中最常用的認(rèn)證機(jī)制单料,和RESTful架構(gòu)風(fēng)格一起埋凯,成為企業(yè)級服務(wù)的標(biāo)配。
目前OAuth已經(jīng)從OAuth1.0發(fā)展到OAuth2.0扫尖,但這二者并非平滑過渡升級白对,OAuth2.0在保證安全性的前提下大大減少了客戶端開發(fā)的復(fù)雜性,因此换怖,Gevin建議在實(shí)戰(zhàn)應(yīng)用中采用OAuth2.0認(rèn)證機(jī)制甩恼。
現(xiàn)在網(wǎng)上關(guān)于OAuth的資料非常豐富,也有大量開源的第三方庫實(shí)現(xiàn)了OAuth機(jī)制沉颂,不熟悉OAuth的同學(xué)從OAuth官網(wǎng)入手即可条摸。
3. 總結(jié)
本真REST + OAuth是RESTful 是微服務(wù)的標(biāo)配
Basic Auth只在開發(fā)環(huán)境中使用
設(shè)計(jì)合理的資源
用正確的HTTP方法對數(shù)據(jù)發(fā)正確的請求
延伸閱讀:
RESTful API 編寫指南
解釋五
理解RESTful架構(gòu) - 阮一峰
越來越多的人開始意識到,網(wǎng)站即軟件铸屉,而且是一種新型的軟件钉蒲。
這種"互聯(lián)網(wǎng)軟件"采用客戶端/服務(wù)器模式,建立在分布式體系上抬探,通過互聯(lián)網(wǎng)通信子巾,具有高延時(shí)(high latency)、高并發(fā)等特點(diǎn)小压。
網(wǎng)站開發(fā)线梗,完全可以采用軟件開發(fā)的模式。但是傳統(tǒng)上怠益,軟件和網(wǎng)絡(luò)是兩個(gè)不同的領(lǐng)域仪搔,很少有交集;軟件開發(fā)主要針對單機(jī)環(huán)境蜻牢,網(wǎng)絡(luò)則主要研究系統(tǒng)之間的通信烤咧。互聯(lián)網(wǎng)的興起抢呆,使得這兩個(gè)領(lǐng)域開始融合煮嫌,現(xiàn)在我們必須考慮,如何開發(fā)在互聯(lián)網(wǎng)環(huán)境中使用的軟件抱虐。
網(wǎng)站開發(fā)昌阿,完全可以采用軟件開發(fā)的模式。但是傳統(tǒng)上,軟件和網(wǎng)絡(luò)是兩個(gè)不同的領(lǐng)域懦冰,很少有交集灶轰;軟件開發(fā)主要針對單機(jī)環(huán)境,網(wǎng)絡(luò)則主要研究系統(tǒng)之間的通信刷钢∷癫互聯(lián)網(wǎng)的興起,使得這兩個(gè)領(lǐng)域開始融合内地,現(xiàn)在我們必須考慮伴澄,如何開發(fā)在互聯(lián)網(wǎng)環(huán)境中使用的軟件。
RESTful架構(gòu)瓤鼻,就是目前最流行的一種互聯(lián)網(wǎng)軟件架構(gòu)秉版。它結(jié)構(gòu)清晰、符合標(biāo)準(zhǔn)茬祷、易于理解清焕、擴(kuò)展方便,所以正得到越來越多網(wǎng)站的采用祭犯。
REST的名稱"表現(xiàn)層狀態(tài)轉(zhuǎn)化"中秸妥,省略了主語。"表現(xiàn)層"其實(shí)指的是"資源"(Resources)的"表現(xiàn)層"沃粗。
所謂"資源"粥惧,就是網(wǎng)絡(luò)上的一個(gè)實(shí)體,或者說是網(wǎng)絡(luò)上的一個(gè)具體信息最盅。它可以是一段文本突雪、一張圖片、一首歌曲涡贱、一種服務(wù)咏删,總之就是一個(gè)具體的實(shí)在。你可以用一個(gè)URI(統(tǒng)一資源定位符)指向它问词,每種資源對應(yīng)一個(gè)特定的URI督函。要獲取這個(gè)資源,訪問它的URI就可以激挪,因此URI就成了每一個(gè)資源的地址或獨(dú)一無二的識別符辰狡。
所謂"上網(wǎng)",就是與互聯(lián)網(wǎng)上一系列的"資源"互動(dòng)垄分,調(diào)用它的URI宛篇。
"資源"是一種信息實(shí)體,它可以有多種外在表現(xiàn)形式薄湿。我們把"資源"具體呈現(xiàn)出來的形式叫倍,叫做它的"表現(xiàn)層"(Representation)豌鸡。
比如,文本可以用txt格式表現(xiàn)段标,也可以用HTML格式、XML格式炉奴、JSON格式表現(xiàn)逼庞,甚至可以采用二進(jìn)制格式;圖片可以用JPG格式表現(xiàn)瞻赶,也可以用PNG格式表現(xiàn)赛糟。
URI只代表資源的實(shí)體,不代表它的形式砸逊。嚴(yán)格地說璧南,有些網(wǎng)址最后的".html"后綴名是不必要的,因?yàn)檫@個(gè)后綴名表示格式师逸,屬于"表現(xiàn)層"范疇司倚,而URI應(yīng)該只代表"資源"的位置。它的具體表現(xiàn)形式篓像,應(yīng)該在HTTP請求的頭信息中用Accept
和Content-Type
字段指定动知,這兩個(gè)字段才是對"表現(xiàn)層"的描述。
訪問一個(gè)網(wǎng)站员辩,就代表了客戶端和服務(wù)器的一個(gè)互動(dòng)過程盒粮。在這個(gè)過程中,勢必涉及到數(shù)據(jù)和狀態(tài)的變化奠滑。
互聯(lián)網(wǎng)通信協(xié)議HTTP協(xié)議丹皱,是一個(gè)無狀態(tài)協(xié)議。這意味著宋税,所有的狀態(tài)都保存在服務(wù)器端摊崭。因此,如果客戶端想要操作服務(wù)器弃甥,必須通過某種手段爽室,讓服務(wù)器端發(fā)生"狀態(tài)轉(zhuǎn)化"(State Transfer)。而這種轉(zhuǎn)化是建立在表現(xiàn)層之上的淆攻,所以就是"表現(xiàn)層狀態(tài)轉(zhuǎn)化"阔墩。
客戶端用到的手段,只能是HTTP協(xié)議瓶珊。具體來說啸箫,就是HTTP協(xié)議里面,四個(gè)表示操作方式的動(dòng)詞:GET伞芹、POST忘苛、PUT蝉娜、DELETE。它們分別對應(yīng)四種基本操作:GET用來獲取資源扎唾,POST用來新建資源(也可以用于更新資源)召川,PUT用來更新資源,DELETE用來刪除資源胸遇。
綜合上面的解釋荧呐,我們總結(jié)一下什么是RESTful架構(gòu):
(1)每一個(gè)URI代表一種資源;
(2)客戶端和服務(wù)器之間纸镊,傳遞這種資源的某種表現(xiàn)層倍阐;
(3)客戶端通過四個(gè)HTTP動(dòng)詞,對服務(wù)器端資源進(jìn)行操作逗威,實(shí)現(xiàn)"表現(xiàn)層狀態(tài)轉(zhuǎn)化"峰搪。
解釋六
解釋七
附:
URI 和 URL 區(qū)別
URI 是統(tǒng)一資源標(biāo)識符,而 URL 是統(tǒng)一資源定位符凯旭。因此概耻,籠統(tǒng)地說,每個(gè) URL 都是 URI尽纽,但不一定每個(gè) URI 都是 URL咐蚯。這是因?yàn)?URI 還包括一個(gè)子類,即統(tǒng)一資源名稱 (URN)弄贿,它命名資源但不指定如何定位資源春锋。上面的 mailto、news 和 isbn URI 都是 URN 的示例差凹。