REST 入門介紹
REST(REpresentational State Transfer)的概念提出已超過10年,不知不覺間已成當今設計開放式API的主流。或許大家手邊的.NET系統整合都還是使用WCF(甚至Web Service)進行跨主機溝通,但是當微軟在ASP.NET MVC 4 Beta里也開始 推廣REST架構的 ASP.NET Web API。如果沒有先了解 RESTful,那接下去的內容還真有點硬,像是專業名詞,例如,你在 ASP.NET Web API 文件中可以看到大量的 Resource (資源) 這個單字,URI 我還能理解,跟 Resource 有什么關系?
關于REST及RESTful的概念,已有不少文章介紹,這里整理幾篇我覺得不錯的參考:
- 維基百科的定義: REST
- 什么是REST跟RESTful? REST理論的中文詳述,其中你可以了解到WCF Restful屬于RPC 樣式的 Web 服務,ASP.NET Web API屬于RESTful Web 服務。
- 深入淺出REST InfoQ的專文介紹,文中甚至有Roy T. Fielding當年REST博士論文的中文翻譯鏈接。另外值得一提的,大家可能沒聽過Roy Fielding的大名,但如果得知他是HTTP規格的主要作者及Apache HTTP Server項目的發起人之一,應該不會有人懷疑他在Web技術領域的分量。 </ul>
- 架構樣式 (Architectural Styles)
- 軟件架構 (Software Architectures)
- 網絡 (Network-based) 為基礎
- 通過URL ( http://www.cnblogs.com/shanyou ) , Client 向 http://www.cnblogs.com/shanyou 發出請求
- www.cnblogs.com/shanyou 收到請求,回應首頁給 Client
- Client 又點擊 REST 文章連結 (假設是 http://www.cnblogs.com/shanyou/archive/2011/06/30/2095018.html) 向 http://www.cnblogs.com/shanyou發出archive/2011/06/30/2095018.html 此篇文章的請求
- www.cnblogs.com/shanyou 收到請求,響應 REST 文章內容給 Client
上面的文章建議大家認真的讀一下,這里我們簡要的介紹下REST 做入門介紹,理解整個 REST 能讓我們在 ASP.NET Web API 的路上更順暢。
REST是什么?
REST ( REpresentational State Transfer ),State Transfer 為 "狀態傳輸" 或 "狀態轉移 ",Representational 中文有人翻譯為"表征"、"具象",合起來就是 "表征狀態傳輸" 或 "具象狀態傳輸" 或 "表述性狀態轉移",不過,一般文章或技術文件都比較不會使用翻譯后的中文來撰寫,而是直接引用 REST 或 RESTful 來代表,因為 REST 一整個觀念,想要只用六個中文字來完整表達真有難度。
REST 一詞的出于《Architectural Styles and
the Design of Network-based Software Architectures》論文,我們先簡單從標題來看,它應該是一種架構樣式 (Architectural Styles) 與軟件架構 (Software Architectures),而且是以網絡 (Network-based) 為基礎,重點就是:
REST 本身是設計風格而不是標準。REST 談論一件非常重要的事,如何正確地使用 Web標準,例如,HTTP 和 URI。想要了解 REST 最好的方式就是思索與了解 Web 及其工作方式。如果你設計的應用程序能符合 REST 原則 (REST principles),這些符合 REST 原則的 REST 服務可稱為 "RESTful web service" 也稱 "RESTful Web API"。"-ful" 字尾強調它們的設計完全符合 REST 論文里的建議內容。
資源 RESOURCE
在 REST 中的資源 (Resource) 代表整個網絡上的資源。網絡上提供了各式各樣的資源,而網絡上的資源由 URI (統一資源標識符,Uniform Resource Identifier) 來提供。
回想,你如何連上我的 博客,你可能通過瀏覽器直接輸入 www.cnblogs.com/shanyou 此域名來到達首頁,也能用書簽或網絡上的鏈接,經點擊后來連上我的博客。然后,你想看這一篇名為「REST 入門介紹」的文章,所以以你接下去點擊這文章的標題連結,接去下閱讀。我們簡易了解一下整個流程:
Client 的通過 URI 來獲取資源的具體象征 (Representational)。Client 取得這些具體象征使這些應用程序轉變其狀態 (以 瀏覽器而言,取得 HTML、CSS、JavaScript … 來生成界面),隨著不斷取得資源的具體象征, Client 端不斷地改變其狀態,這樣不斷的反復 (iterations ) 過程就是所謂的 Representational State Transfer。
使用 WEB 標準
上述是最接近日常的范例,這些行為在 HTTP 規范中稱之為 GET,也就是通過URL 來 GET 我想要的資源。另一常用的例子是填寫表單,例如,登入表單,我想進行登入動作,就必須先發送賬號與密碼給某一資源,此資源會驗證你所傳送的數據是否正確, 再進行后續動作。我們發送信息給資源的行為在 HTTP 規范中稱之為 POST。
在 HTTP/1.1 RFC 2616第 5.1.1 Method 一節定義了八大類 HTTP 方法,除了我們常用的 GET 與 POST 之外,在 REST 中常用的還有 PUT 與 DELETE。此 GET, POST, PUT, DELETE 正好可以對應我們 CRUD (Create, Read, Update, Delete) 四種數據操作。
HTTP Method 與 CURD 數據處理操作對應 |
||
HTTP方法 |
數據處理 |
說明 |
POST |
Create |
新增一個沒有id的資源 |
GET |
Read |
取得一個資源 |
PUT |
Update |
更新一個資源。或新增一個含 id 資源(如果 id 不存在) |
DELETE |
Delete |
刪除一個資源 |
RESTFUL WEB SERVICE
RESTful Web Service (又稱 RESTful Web API) 是一個使用 HTTP 并符合 REST 原則的 Web 服務。我們知道,通過 URL 可以傳送 GET 請求,在 表單指定 method="GET|POST" 來送出請求。但我們要處理 PUT 或 DELETE 的請求呢?通過 RESTful 我們可以簡單 URI 來定義資源并和 HTTP 方法配合使用。
Resource 與 HTTP 方法的對應 |
|||||
資源 |
資源說明 |
GET |
PUT |
POST |
DELETE |
http://www.cnblogs.com/Products/ |
Products是一組資源集合 |
列出 該組資源集合中每個資源的詳細信息 |
更新 當前整組資源 |
新增 或附加一個新資源。該操作傳回新資源的URL |
刪除 整組資源 |
http://www.cnblogs.com/Products/1 |
Products/1是單個資源 |
取得 指定的資源的詳細信息 |
更新 或新增指定的資源 |
新增 或附加一個新元素 |
刪除 指定的元素 |
以上表格有沒有很像我們一般在對數據庫表格的操作順序,進入一個 Table 的數據首頁 (通常是列表),此頁面會有「新增、更新、刪除、詳細」等連結,你想進行什么操作,就點那一個連結。
在 RESTful 每個資源有自己獨立的 URI, Client 從資源集合或單個資源開始進入,不管是資源集合或單個資源,我們都能與 HTTP 方法配合使用,例如,GET 下載,PUT 更新,POST 新增,DELETE 刪除。
ASP.NET Web API 是一個框架(framework),能讓你在 .NET Framwork 之上架設 HTTP 服務 (HTTP Services)。ASP.NET Web API 是 .NET Framework 上構建 RESTful 應用程序的理想平臺。
在 Julie Lerman's 的 How I see Web API 一文中,用了一張圖來簡明說明 Web API: