REST(REpresentational State Transfer)的概念提出已超過10年,不知不覺間已成當今設計開放式API的主流。或許大家手邊的.NET系統整合都還是使用WCF(甚至Web Service)進行跨主機溝通,但是當微軟在ASP.NET MVC 4 Beta裡也開始推廣REST架構的ASP.NET Web API(延伸閱讀: 小朱的ASP.NET 4.5介紹, gelis的ASP.NET Web API介紹, KKBruce的ASP.NET Web API筆記),再不了解"什麼是REST",就有被當成過氣老人的危險,在參與技術會議時可能會因不懂REST等新名詞被年輕開發人員排擠而心靈受創,進而影響身心健康及職涯發展,自此升遷無望工作不順家庭失和抑鬱而終... orz 好啦! 沒那麼嚴重,這是資訊焦慮症重度病患腦補出來的情節,懂不懂REST沒這麼重要,但多知道一些也無妨,大家就抱著輕鬆的心情了解一下RESTful Web Service吧!

關於REST及RESTful的概念,已有不少文章介紹,這裡整理幾篇我覺得不錯的參考:

  • 維基百科的定義: REST
  • 什麼是REST跟RESTful?
    REST理論的中文詳述
  • 深入浅出REST
    InfoQ的專文介紹,文中甚至有Roy T. Fielding當年REST博士論文的中文翻譯連結。另外值得一提的,大家可能沒聽過Roy Fielding的大名,但如果得知他是HTTP規格的主要作者及Apache HTTP Server專案的發起人之一,應該不會有人懷疑他在Web技術領域的分量。(由wiki OSCON08的那張照片來看,本人確實也相當有"分量" XD)
  • REST and RESTfull web service  RESTful 介面實作示範 (by 石頭成)
    這兩篇提到具體HTTP Method等實做細節,雖是以PHP為例,但也很值得一讀

與Web Service裡成堆,複雜到令人頭皮發麻的SOAP XML規格,REST真的單純簡潔許多--給對URL就可以找到指定的資源(這同時也有利於SEO),再用不同的HTTP Method指定操作。雖然佛心的Visual Studio可代勞Web Service整合過程裡可觀的瑣事雜工,只需Add Web Reference拉進Web Service或WCF遠端方法就能開始幹活,IntelliSense甚至還會提示方法引數;只是一旦跨越不同平台,或是來到AJAX掛帥時代的JavaScript主戰場,不管處理Requset或Response都得與又臭又長的SOAP XML一路周旋,光想都叫人直冒冷汗。相形之下,只需要XmlHttpRequest + JSON就能搞定的RESTful Web Service,真是無比親切可愛呀! 也因此,許多公開API開始捨棄Web Service,以REST-like或RESTful的方式提供API介面。

對RESTful有初步了解後,下一個焦點在於如何實現它,ASP.NET MVC 4提供了現成的模版可以在彈指之間做出一個RESTful的Web API,不過我有不一樣的計劃: 挑戰用ASP.NET 3.5 Web Site Project仿效ASP.NET Web API實現RESTful Web Service!!

動機有三: 1) 實際做過一次可接觸很多被ASP.NET MVC封裝的底層運作細節,是很好的練功途徑 2) 畢竟不是每一個專案都能馬上改用ASP.NET MVC,而我希望能在限定ASP.NET 3.5的專案中,也有機會玩玩RESTful 3) 只有自己動手過才能確實搞懂細節,可累積未來射ASP.NET Web API茶包的功力。

開始之前,先來釐清RESTful Web Service精神的幾項重點:

  1. 使用URI來代表目標資源,在CRUD情境中目標資源即為要查詢或更新的資料。
    一般來說可採用以下方式表現:
    /product/a1234 <= 編號為a1234的商品資料
    /product <== 所有商品資料
    /product?catg=Notebook <== 所有筆記商品資料
  2. 使用不同的HTTP Method來區別操作。在傳統Web應用中,多半只用到GET與POST;而在RESTful Web Service中,則會使用GET、POST、PUT、DELETE分別代表查詢、新增、修改、刪除動作。
  3. 除了HTTP Method,HTTP Status Code也被用於表示執行結果,例如: 當查詢不到URI指定的商品時,可傳回HTTP 404;當新增資料完成時,傳回HTTP 201,並在Response Header中,以Location指向查詢該筆資料的URI。

回歸到技術面上,ASP.NET 3.5已具備Routing功能,可輕易實現"URL輸入/product/a1234,實際導向/boo/Product.aspx"的要求;至於由Client端送出不同的HTTP Method,屬於XHR的基本功能,不成問題;而在ASP.NET中要傳回不同的Status Code也不是難事。換句話說,用ASP.NET 3.5打造RESTful Web Service是具體可行的!

後續文章將開始深入技術細節。


Comments

# by @RSChiang

感謝黑大的分享XD 附帶一提應該是IntelliSense (而非 Intellisence)?

# by Jeffrey

to RSChiang, 謝謝指正,已修改。我八成是得了"不寫錯字就不會PO文"的病,錯別字儼然已經成為我文章的註冊商標了... orz

Post a comment