前言:有網友讓我用通俗的語言來說一講RESTful , 我在這一塊工程實踐的不太多,有點爲難了, 只能講一講個人理解, 歡迎你們批評指正。計算機行業最擅長造新詞了,像什麼AJAX,IoC, AOP, SOA, NoSQL, 微服務,TDD,敏捷,RESTful......等等。
有不少人很是喜歡在口頭拽這些熱門名詞,顯得多麼高深的樣子, 其實這些熱詞背後表明的東西,要解決的問題沒那麼複雜,不少人是因爲帶着敬畏心被嚇住了。
RESTful就是其中之一, 它不是一個新的計算機語言或者技術, 只是一個架構風格, 準確一點講是如何設計系統來對外提供服務。
傳統網站我在2000年左右仍是微軟粉絲,一直用ASP + COM 寫Web網站, 當時的網站是單純的HTML, 只有一點javascript效果, 這些網站基本上是自治的「獨立王國」, 不會經過API接口對外提供服務。
因爲在瀏覽器中經過javascript來異步訪問後端接口的極少, AJAX這個熱詞尚未出現, 因此當時在ASP中主要處理兩個東西:圖1 : 常見的網站操做很普通,對吧? 其實如今大部分網站仍是這麼作的。 SOA後來互聯網大發展, 各個網站系統變的愈來愈複雜,一個自治的「帝國」常常要被劃分紅多個「王國」,這些王國之間如何溝通和交流變得重要起來。
一些大廠商順勢制定了叫作SOA的標準,提出了面向服務的架構體系。
和面向對象這樣的技術術語不一樣 , SOA中的服務實際上是業務層面的東西, 是個業務活動的邏輯表達方式,粒度更粗一些。
這些服務獨立於廠商,產品和具體實現技術, 可以發佈出來被別的系統調用, 還可以被組合起來造成更粗粒度的「服務」。
雖然服務是面向業務的, 但還得用具體的技術表達出來, 毫無心外, 大佬們選擇了XML, 用XML來描述一個服務看起來來像這個樣子:
圖2: 服務描述片斷
沒有玩過Web Service 的不用徹底看懂它,它描述的也是一個getBook這樣的操做, 輸入是一個id ,類型是字符串。
返回值也是一個字符串 (一般是XML格式的,表示書籍的詳細信息)
我想突出的重點是這個服務(getBook)和 「圖1" 中的getBook.action 在形式上的一致性:
他們都試圖表達這樣一個過程: 得到一本書的信息, 因此這兩種方式都是面向過程的。或者說,他們都以動詞爲主, getBook, addBook, deleteBook , placeOrder, registerUser, login , transfer 等等。
RESTful其實面向過程,以動詞爲主的方式是最天然的方式, 碼農不用怎麼費腦子就能想到如何設計。
而後RESTful 這種概念就漂洋過海,從美國殺入了中國市場。
RESTful告訴你們說: 之後大家不要用動詞, 用名詞更好, 不要面向過程了, 要面向資源(Resource)。 資源使用一個URI來表達的, 例如 :圖3 : REST風格的資源
注意圖3 中的books, orders, 這些都是名詞, 那問題天然就來了: 我怎麼作傳統的add, delete等操做呢?
RESTful 說: 要充分利用HTTP 提供的方法:圖4: 對資源的操做
你看增刪改查都齊全了。
須要注意的是服務器端返回信息的格式由發起調用的客戶端指定,例如HTML ,JSON, XML, 這稱爲資源的表述(representation)
我第一次看到這種方式的時候大爲震驚, 這實在是太不直觀了。
按照這種風格,你須要把服務器端的東西都 」資源化「, 像上面的那些很容易, 還有一些例如轉帳,登陸,忘記密碼,獲取短信驗證碼,這樣常見的業務操做「資源化」起來就不那麼爽了。
RESTful 架構風格還要求Stateless(無狀態), 服務器端並不會維護/保存會話(session)信息, 這些會話信息應該有客戶端來維持,每次請求時也須要一併發送到服務器端。
服務器端甩掉了會話狀態這個大包袱,一會兒就輕鬆多了,可擴展性會有極大提高, 例如我能夠把一個服務部署到由100個服務器組成的集羣中,每一個服務器均可以處理用戶的請求。
假設用戶第一個請求發到了服務器#87 ,而後這個服務器壞了, 第二次請求能夠發送到剩下99個服務器中的任何一臺, 反正會話信息包含在每一個請求中, 任意一臺服務器都能處理。
我認爲RESTful的無狀態是一種理想的境界,現實中不大容易作到, 客戶端到底如何保存session信息呢,是每次請求都把用戶名/密碼 發到服務器端仍是經過第三方認證的方式實現?
若是想實現一個購物車的應用, 服務器不保存session的話該怎麼作? 我這塊兒實踐很少,請高手不吝賜教。
雖然有難度, 那爲何如今不少人對REST趨之若鶩呢?
我我的認爲你們是看中了他的輕量級的風格, 那就是用HTTP+JSON就能夠搞定一切。
傳統的SOA傾向於用WSDL來描述服務, 用SOAP協議來訪問服務,此外還有服務註冊,發現, 組合,總線,安全等一系列問題, 一般還得上Websphere ,WebLogic 這樣重量級的服務器。
碼農不只要問了: 我就想調用一個簡單的接口, 搞這麼麻煩幹嗎?
REST一來, 寫個Web服務簡直是太簡單了, 用一個最「低級」的java servlet, 分分鐘搞定, 不過有時候你們也沒有嚴格的遵循REST的要求, 沒有把一切東西都「資源化」,由於那樣太不容易了。javascript
我看到的不少項目號稱是REST風格, 但其實就是經過HTTP和JSON對外提供的服務而已 ,沒有完整的遵循REST架構風格的約束, 能夠說是「掛着REST的羊頭,賣着面向過程的狗肉」。java
最後,推薦你們去讀一下RESTful架構風格的提出者Roy Fielding 博士的論文, 2000年發表的《架構風格與基於網絡的軟件架構設計》, 這是RESTful開山之做, 也是Web發展史上很是重要的一篇文獻。後端
(完)瀏覽器
聲明:原創文章,未經受權,禁止轉載
你看到的只是冰山一角, 更多精彩文章,盡在「碼農翻身」 微信公衆號, 回覆消息"m"或"目錄" 查看更多文章安全
http://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665513217&idx=1&sn=a56253effadfc14d428966e0dbc9962b#rd服務器