參考:http://www.ruanyifeng.com/blog/2011/09/restful.html
一、REST名稱
??Representational State Transfer:表現(xiàn)層狀態(tài)轉(zhuǎn)化。
??如果一個(gè)架構(gòu)符合REST原則,就稱它為RESTful架構(gòu)。要理解RESTful架構(gòu),最好的方法就是去理解Representational State Transfer。
二、理解REST
1.資源(Resource)
為什么要說資源:
??“表現(xiàn)層狀態(tài)轉(zhuǎn)化”其實(shí)指的是“資源”的”表現(xiàn)層“。
資源是什么:
??就是網(wǎng)絡(luò)上的一個(gè)實(shí)體。它可以是一段文本,一張圖片,一種服務(wù)。可以用一個(gè)URI指向它,每種資源對應(yīng)要給特定的URI。
2.表現(xiàn)層(Representational)
??資源是一種信息實(shí)體,它可以有多種外在表現(xiàn)形式。我們把資源呈現(xiàn)出來的形式,叫做它的“表現(xiàn)層”。
??比如,文本可以用txt格式表現(xiàn),也可用HTML格式、XML格式、JSON格式表現(xiàn)。URI只代表資源的實(shí)體,不代表它的形式。
3.狀態(tài)轉(zhuǎn)化(state transfer)
??訪問一個(gè)網(wǎng)站,就代表了客戶端和服務(wù)端的一個(gè)互動(dòng)過程。勢必涉及到數(shù)據(jù)和狀態(tài)的變化。
互聯(lián)網(wǎng)通信協(xié)議HTTP協(xié)議,是一個(gè)無狀態(tài)協(xié)議。意味著所有的狀態(tài)都保存在服務(wù)器端。因此,如果客戶端想要操作服務(wù)器端,必須通過某種手段,讓服務(wù)器發(fā)生“狀態(tài)變化”。而這種變化是建立在表現(xiàn)層之上的,所以就是“表現(xiàn)層狀態(tài)轉(zhuǎn)化”。
三、綜述
綜上,得出RESTful架構(gòu)
1)每一個(gè)URI代表一種資源;
2)客戶端與服務(wù)器之間,傳遞這種資源的某種表現(xiàn)層;
3)客戶端通過HTTP動(dòng)詞(GET、POST、PUT、DELETE等)對服務(wù)器端資源進(jìn)行操作,實(shí)現(xiàn)“表現(xiàn)層狀態(tài)轉(zhuǎn)化”。
四、常見誤區(qū)
1)URI包含動(dòng)詞。因?yàn)橘Y源是一種實(shí)體,所以應(yīng)該是名詞,動(dòng)詞應(yīng)該放在HTTP協(xié)議中。
舉例1:posts/show/1因show是動(dòng)詞,正確寫法應(yīng)該是posts/1,然后用GET方法表示show
舉例2:如果某些動(dòng)作是HTTP動(dòng)詞表示不了的,就應(yīng)該把動(dòng)作做成一種資源。如網(wǎng)上匯款,從賬戶1向賬戶2匯款500元,錯(cuò)誤的URI:POST /accounts/1/transfer/500/to/2,正確寫法是把動(dòng)詞transfer改成名詞transaction,資源不能是動(dòng)詞,但可以是一種服務(wù):
POST /transaction HTTP/1.1
HOST: 127.0.0.1
from=1&to=2&amount=500.00
2)URI中加入版本號(hào):
http://www.example.com/app/1.0/foo
http://www.example.com/app/2.0/foo
??因不同版本可理解為同一個(gè)資源的不同表現(xiàn)形式,所以采用同一個(gè)URI。版本號(hào)可以在HTTP請求頭信息的Accept字段中進(jìn)行區(qū)分,也可以放在URL中。
Accept: vnd.example-com.foo+json; version=1.0
Accept: vnd.example-com.foo+json; version=2.0