1992年網站(Web Sites)是在Web瀏覽器和Web服務器直接經過HTTP傳輸HTML。html
2000年WS-* (Web Services)是在客戶端和服務器之間基於HTTP傳輸SOAP XML格式的數據,服務端用WSDL來規定契約。json
2007年RESTful (Web Services)是在客戶端和服務器之間基於HTTP傳輸JSON、PO-XML、RSS格式的數據,服務端用WADL來規定契約。設計模式
解決企業軟件標準化的問題瀏覽器
企業計算的互用性標準緩存
一個提供消息、描述、發現規範的分層架構安全
可以快速從底層構建提供解決方案服務器
工具能夠將複雜性屏蔽網絡
Web應用(Web Applications)與 企業計算(Enterprise Computing)數據結構
一個關於Web Services文檔的不徹底統計(http://www.tbray.org/ongoing/When/200x/2004/09/21/WS-Research)架構
什麼是REST?
RESTful的設計
WS-*與REST的比較
討論
前瞻
REST爲Web定義了一個架構風格
它的四個原則能夠用HTTP協議來實現
建立(POST《-》)——建立一個子資源
讀取(GET《-)——獲取當前資源的狀態
更新(PUT -》)—— 初始化或更新一個URI對應的資源狀態
刪除(DELETE)——清除一個資源(在一個URI失效以後)
例如:
http://tools.ietf.org/html/rfc3986
http——統一資源標識符方案(URI Scheme)
://tools.ietf.org——受權(Authority)一般是一個主機名
/html/rfc3986——路徑(Path)
https://www.google.ch/search?q=rest&start=10#1
?q=rest&start=10——查詢(Query)
#1——片斷(Fragment)
GET /book?isbn=24&action=delete
DELETE /book/24
REST URI對於客戶端透明的意思是它是由後續的連接提供,而不是經過客戶端自行建立
注意:URI模板引入了客戶端和服務端的耦合
關於REST實現的最佳實踐有些區別(在本人實際工做中,不少技術實力雄厚的大型企業,對於REST最佳實踐的方案也基本能夠歸爲如下兩種,而第一種「低級」REST比較廣泛)
補充說明:
(*)有些防火牆或者HTTP的代理可能丟棄PUT/DELETE請求
(**)XML能夠被RDF、JSON、YAML或者ATOM(ATOM存在很大的爭議)替代
XML | JSON(JavaScript Object Notation) |
—PO-XML | 爲AJAX Web應用引入格式供(瀏覽器-Web服務器通信) |
—SOAP(WS-*) | |
—RSS,ATOM | |
半結構化的數據和標準的文本語法 | 文本語法支持序列化非循環的數據結構 |
工具:XML Schema,DOM,SAX,Xpath,XSLT,Xquery | 有不少語言支持(不只僅JavaScript) |
每一個人均可以解析它(不須要理解) | 不須要擴展 |
慢、臃腫 | JSON已經成爲AJAX中的X而不是XML |
REST 的優與劣
優點(Strengths) | 劣勢(Weakness) |
簡單 —統一接口不可變動 |
混亂(區分high REST和low REST) |
HTTP/POX 無處不在 | 在先後臺系統設計中存在不匹配的狀況(異步消息和事件驅動) |
無狀態/同步交互 | 除了HTTP/SSL不能實現其餘的企業應用的風格(*) |
可擴展 | |
易於理解並採用(輕量級) —只須要一個瀏覽器,不須要WS中間件 |
對於合適的識別和定位全部應用中的資源時一個挑戰 |
樸素的方法(grassroot approach) | 缺少標準(本人認爲REST是一個設計風格而非標準) |
被全部的Web2.0應用採用 —85%的客戶都喜歡Amazon的RESTful API —Google再也不支持SOAP/WSDL API |
語法和語義的描述是非正式的(面向用戶的) (本人認爲這也偏偏是一個優點) |
(*) 關於企業的應用風格(-ilities)參照文章http://www.cnblogs.com/richaaaard/articles/5006681.html
是否不能實現咱們還有待探討
更多的信息能夠查看Doodle API: http://doodle.com/xsd1/RESTfulDoodle.pdf
(固然在RESTful下也有不少其餘的API實現)
主要體如今HTTP的標準響應碼上
對於GET、PUT、DELETE這些冪等操做,能夠執行屢次而不會對服務端的狀態產生其餘影響,能夠在服務器宕機或者出現內部錯誤而恢復事後,從新發起這些請求。對於POST這種非冪等操做就須要在出現異常以後特殊處理,在有些場景下,它也能夠被設計成冪等操做來實現:
B = GetBalance() // safe B = B + 200$ // local SetBalance(B) // safe
就是一個蘋果和一個橘子的對比。一個是中間件互用性的標準,另外一個是Web架構的風格。
—應用須要把它的信息經過URI發佈到網絡
—應用能夠與網絡交互,可是他們處於網絡以外
REST | SOAP |
REST是基於人類可讀的文檔,它定義了請求的URI和響應(XML,JSON) | 客戶端的stubs能夠經過WSDL的描述用大多數語言生成 (實際上SOAP也是一種XML,也是可讀的) |
須要大量的測試和調試,由於URI是手工建立的 (是否有相關工具) |
每一個服務都根據本身的語法發佈本身的接口 |
咱們爲何須要強類型的消息? (若是客戶端和服務端都很清楚傳輸的內容是什麼) |
強類型 |
WADL | WSDL1.1(整個開放端口對於GET和POST是統一的) |
XML 足夠了?(實際上有JSON、XML等其餘) | WSDL2.0(更靈活,每一個方法的GET or POST可選) |
REST | SOAP |
REST的安全就是HTTPs | SOAP的安全定義在WS-Security中 |
被證實的(SSL1.0 自1994) | XML加密 |
XML簽名 | |
—完全的互用性沒有意義 | |
—性能? | |
點到點安全(認證、完整和加密) | 端到端安全,不須要HTTPs |
REST | SOAP |
顯性的狀態轉換 | 隱性的狀態轉換 |
—通訊是無狀態的 | —服務端能夠保持狀態 |
—資源數據包含了有效的狀態連接 | —消息只包含數據 |
—客戶端根據連接來獲取並維護狀態 | —客戶端根據服務端的狀態機邏輯來維護本身的狀態 |
Session技術 | Session技術 |
—Cookies(HTTP Headers) | —Session Headers(非標準) |
—URL Re-writing | |
—表格字段隱藏 |
異步可靠的消息
POST /queue 202 Accepted Location: /queue/message/1230213 ____________________________ GET /queue/message/1230213 DELETE /queue/message/1230213
REST | SOAP |
XML | O/XML 綁定 |
其餘的方式JSON、YAML、RDF | |
XML Schema | 數據格式的契約須要和接口一塊兒定義 |
HTTP | 儘管REST認爲SOAP誤用了POST |
鬆耦合可擴展 | SOAP提供同步異步方式 |
SOAP認爲統一的接口不會改變 |
(然而市面上有些產品實際上能夠支持他們的相兼容)
參考:
《SOA設計模式》 由Thomas Erl及其餘供稿者合著,做爲Thomas Erl關於面向服務計算叢書的一部分,於2009年1月由Prentice Hall出版,ISBN 0136135161,版權全部2009 SOA System Inc.。
Web Services and Service Oriented Architectures@2009 Cesare Pautasso