RESTful知識要點小結
REST是新一代的web service設計標準,關于REST的定義,以及同傳統(tǒng)SOAP相比較的優(yōu)略,這里就不羅嗦了,以后可以直接google。
這里先總結一下目前學到的REST相關知識。
REST中存在兩個很重要的概念:資源 和 狀態(tài)轉移,一定要以這兩個概念為核心,再去了解其他的如緩存、安全等方面。好了,廢話少說,直接看總結:
1. 定義資源
REST的首要步驟之一就是定義資源。將客戶端對URL的訪問定義成對不同資源的訪問。
2. 定義統(tǒng)一接口
HTTP是一種應用協(xié)議,而不僅僅是傳輸協(xié)議。HTTP定義了諸如GET、PUT、DELETE、POST等方法對資源進行操作。有了他們,我們無需創(chuàng)造createOrder, getStatus, updateStatus等應用程序特定的操作了。
所以,能否從HTTP基礎設施中獲得多少利益,主要取決于您把它當做應用層協(xié)議用的有多好。
GET用于獲取資源
PUT用于更新資源
POST用于創(chuàng)建資源
DELETE用于刪除資源
3. 定義表述(Representation)
資源是一個抽象的實體,因此需要在響應時定義一種對資源的表述。表述的類型有很多種格式,常見的有xml、json、PDF、CSV等等
4. 使用鏈接(link)實現(xiàn)狀態(tài)轉移
鏈接(link)提供了一種方式,幫助你從一種資源轉移到另外一種資源,這種方式正好解釋了REST中Transfer的含義。譬如,當使用GET獲取一個1000條資源的列表時,如果當前的表述無法包括所有的的資源,則可以在當前表述中加上-“前頁”/“后頁”等的內部鏈接,從而幫助客戶端完成對剩余資源獲取的轉移。
如下定義的表述中返回一組書籍的列表,同時在結果中定義了對"prev"和"next"等狀態(tài)的轉移。
"results": [{
"price": "25"
"name": "java in action",
"title": "java in action",
"category": "IT",
"isbn": "109422476",
"description": "xxxx"},
{
"price": "40"
"name": "Ruby in action",
"title": "Ruby in action",
"category": "IT",
"isbn": "109422479",
"description": "xxxx"}
]
"links": [
{
"uri": "xxxx",
"rel": "prev"
},
{
"uri": "xxxx",
"rel": "next"
}],
"available-results": 200
}
另外,關于流程的狀態(tài)遷移,可以一步一步按照客戶端發(fā)出的請求返回符合條件的鏈接。
比如流程是A->B->C->D,當請求A時,實際上并不知道接下來能否滿足條件訪問B,只有當服務器成功響應請求A后,在A的響應中加入對資源B的鏈接,此時,客戶端才可以繼續(xù)訪問B的請求。
以此類推,達到了流程化中對多種資源狀態(tài)轉移的實現(xiàn)。
5. 安全
可以采用2種方式:
1)當客戶端訪問一個受保護資源時,可以設置Authenticate頭,對<認證用戶名>:<Secret>采用base64編碼,發(fā)送給服務器端.此種方式可以詳見HTTP協(xié)議。
2)客戶端先發(fā)送請求,包括用戶名和加密過的密碼,服務器響應后,返回特殊的key,客戶端下次訪問時候,攜帶上該key,例如
客戶端采用POST發(fā)送請求:
"email":"xxxxx",
"password":"xxxx"
}
服務器端返回請求:
"email":"xxxx"
key:"xxxxxxxxxxxxx"
}
當客戶端需要再次訪問受限資源時,可以附帶上該key,這樣服務器端就知道請求的操作是否能訪問受限資源了。
6. 緩存
緩存可以幫助增加可靠性、減少服務器開銷、降低成本等。REST的緩存主要是利用HTTP協(xié)議的緩存機制,如Header中的no-cache、Expire、Cache-Control等