
REST架構風格的服務(或者它開放的api),屬于Programmable Web。研究REST 架構風格,要從Programmable Web說起。
Programmable Web一詞來源于《Restful Web Services》,我覺得憑字面意思理解就好了。所謂的Programmable Web,可以理解為網站的內容源自服務器的資源,服務器上的所有資源都能夠以某種方式提供給客戶端,客戶端的網站可以根據自己的需求設計每個頁面,以及頁面中可以顯示的服務器端資源。從Programmable Web角度看,twitter是對twitter api編程產生的一個產品;新浪微博的官方網站,第三方客戶端和應用等也都是基于新浪微博api編程產生的一系列的產品。
組成部分
Programmable Web主要由三部分組成:HTTP,Method Information(方法信息)和作用域(Scoping Information)。
HTTP
我們談論的是web,web上少不了http。(http詳情可以參考wikipedia)
對于Programmable Web而言,客戶端要獲得服務器上的資源,需要發起一個http request,服務器接收客戶端的請求并作出反饋會給客戶端發送一個http response,http request和http response都要封裝到envelope中傳輸
http request的主要組成
http method
如GET
,POST
,這些又被稱為http動詞,用于指示客戶端期望服務器如何處理http requestpath
URI中的hostname右邊的部分,如 http://essay.igevin.info/2013/05/01/how-pm-know-tech.html 中的2013/05/01/how-pm-know-tech.html
request header
request header是以 key:value(鍵值對) 形式描述的元數據信息(metadata)。HTTP協議中定義了一些標準的header,我們也可以添加自定義的http headerentity-body
envelope中的信息正文。entity-body可以為空,如GET請求,不需要entity-body中的信息
http response的主要組成
http response code
response code告訴客戶端向服務器請求的結果是成功,失敗或者其他情況,如200
表示成功,301
表示永久的重定向,404
表示not found…… 詳情請看這里response header
與上面相同entity body or representation
與上面相同。值得一提的是,這里的內容是貼有“標簽”的(標簽的內容會放在response header的元數據content-type
中)。這些標簽會告訴瀏覽器如何處理這些response信息。例如,如果在content-type
中指明類型為text/html
,則瀏覽器會將這里的response信息解析為html文檔,并渲染為web頁面。常用的http content type 可以參考這個頁面
現在不同的web service在設計與實現時,對兩個問題的解決差別很大,分別為如何傳遞 『Method Information』以及如何表達『Scoping Information』
Method Information
Method表達的是,客戶端如何向服務器傳達自己請求的操作是什么(create, delete, update or read?),或者服務器暴露出來的api對數據或者請求做怎樣的處理。
REST 架構風格利用HTTP method作為Method Information的載體。
Scoping Information
Scoping information表達了數據的選擇。服務器應該對哪個數據集執行客戶端的請求操作?為什么服務器要update(or get, delete, etc.)這個數據集,而不去update那個數據集?這些都是由Scoping information決定的。
有些web service 會將Scoping Information封裝到請求的envelope中,而RESTful架構風格直接將該信息暴露在url中。
最后
本文介紹了Programming Web的三個主要組成部分: http, method 和scope。由于不同的web service對method information和 scoping information的處理方式不同,架構風格可以分為 RESTful, RPC-Style及REST-RPC混合架構,這些架構有何不同,這里先挖個坑,后面填上~
圖片來源于網站 programming web(PS:與本文的『programming web』不是一回事 :P)