000 什麼是Web Service
Web Service是一種基於HTTP協議的服務,用戶通過發送HTTP請求服務器上的資源,服務器也會把資源信息放在HTTP響應中返回
給請求者。它實際上是一種調用關係,只是被調用主體從本地函數變成了遠端某個服務器上的服務。
什麼是HTTP
001 RPC和RESTful的區別
當我們發起一個請求向服務器請求一個資源,那麼有兩個東西需要明確,一是方法信息,它用來說明要對數據採用什麼樣的操作,
比如是創建還是刪除,是更新還是獲取。二是作用域信息,它用來說明要對什麼數據採取操作,比如是股票數據還是天氣數據,是今天
的股票數據還是這一整個月的股票數據。
當明確了這兩個部分之後,對於一個Web Service請求就可以確定對什麼數據採取什麼操作,也就完整說明了這次請求的主體和
主體上的動作。
一個RPC式的Web Service的方法信息和作用域信息通常都放在HTTP報文體內,即只是把HTTP作爲一個傳輸協議,對於所有請求
HTTP本身無差別的對待。下是一個假想的SOAP服務的例子,可以看到在Content-type中指明瞭內容是soap+xml,方法信息是get,
作用域信息是people。
POST / HTTP/1.1
Host: www.somewebsite.com
Content-Type: applicatin/soap+xml
...
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:body>
<get>
<q>people</p>
</get>
</soap:body>
</soap:Envelope>
而一個RESTful的Web Service最大化的利用了HTTP協議本身,使用HTTP本身的動詞GET,PUT,POST,DELETE等表示方法
信息,同時將作用域信息放在URL裏。下面是一個RESTful的例子,使用HTTP本身的GET來描述方法信息,將作用域信息放在URL裏,
相較於上面的SOAP的方式,整個請求信息簡單,規整了許多,這也是RESTful的一個優點。
GET people/ HTTP/1.1
HOST: www.somewebsite.com
...
其中報文體爲空
002 面向資源的架構
實際上REST本身不是一個架構,確切的來講它是一組設計原則。而REST的服務本身就是面向資源,所以這裏講面向資源的架構。在
面向資源的架構裏面有幾個重要的概念:
首先,什麼是**資源**?實際上RESTful的Web Service提供的一切服務都是資源,比如一個文檔,一份地圖,一個數據,總之就
是任何具有被引用必要的事物都可以看作資源。而資源通過URI的方式暴露出來,供客戶端訪問,每個資源與一個URI唯一對應。
然後就是如何對資源進行**表示**?即請求返回什麼樣的數據。資源的表示只是關於資源當前狀態的一些數據,例如對於同一份文
檔,可能會有word版,pdf版,html版可以訪問,但是實際上的數資源都是一樣的只是表示的不同。
除此之外,面向資源的構架還有以下四個重要的特性
1.可尋址性
可尋址性實際上是Web應用的最大優點,它令客戶端可以靈活自由地使用網站。如果一個Web Service是不可尋址的,那麼用戶就
無法用標準的規則對它進行訪問。
2.無狀態性
無狀態性是HTTP協議本身的特性,它意味着每個HTTP請求都是完全孤立的。當客戶端發出一個HTTP請求時,請求裏包含服務器實
現該請求所需要的全部信息,服務器不依賴任何請求提供的信息。假設本次請求需要之前某個請求提供的信息,那麼客戶端應當把那個
信息也包括在本次請求裏。
也就是說對於同一個URI,以相同的訪問條件,不管訪問多少次,返回的結果都應該是相同的(不考慮服務器數據自身變動的情況
下),每一個URI就對應了服務的一個狀態,請求結束後服務器都會回到初始狀態。
3.連通性
我們平常使用的互聯網的各個網站之間使用鏈接的方式連接起來的,一個網頁中會有指向其他頁面的超鏈接,通過點擊這些超鏈接
就可以繼續訪問接下來的頁面。
對於Web Service來說也是這樣,返回的不止有數據,還有指向其他數據的鏈接,這種“具有鏈接”的特性叫做聯通性。資源間的聯
通性越好,資源間的關係就越清晰就越易於使用。
4.統一接口
統一接口實際上是爲了對RESTful Web Service進行規範化,如果不進行這個統一,雖然大家都是用HTTP本身的動詞作爲操作方
法,但是可能你用GET獲取數據,我用HEAD獲取數據,對客戶端來說無法用一致的方式對數據進行獲取。
HTTP提供了四種基本方法,用於四種最常見的操作。
- 獲取資源的表示:HTTP GET
- 創建一個新資源:向一個新的URI發送HTTP PUT,或者像一個已有的URI發送POST
- 修改一個資源:向已有的URI發送HTTP PUT
- 刪除已有資源:HTTP DELETE
003 設計RESTful Service的一般步驟
1. 規劃數據集
2. 把數據集劃分爲資源
3. 用URI爲該資源命名
4. 暴露一個統一接口的子集
5. 設計來自客戶端的表示
6. 設計發送給客戶端的表示
7. 用超鏈接和表單把該資源和已有資源聯繫起來
8. 考慮可能出現的錯誤情況