以下主要對 REST 做入門簡介,理解整個 REST 能讓我們在 ASP.NET Web API 的路上更順暢。
何謂REST
REST ( REpresentational State Transfer ),State Transfer 為 "狀態傳輸" 或 "状态转移 ",Representational 中文有人翻譯為"表徵"、"具象",合起來就是 "表徵狀態傳輸" 或 "具象狀態傳輸" 或 "表述性状态转移",不過,一般文章或技術文件都比較不會使用翻譯後的中文來撰寫,而是直接引用 REST 或 RESTful 來代表,因為 REST 一整個觀念,想要只用六個中文字來完整表達真有難度。
在我的《朗文當代辭典》中是這樣解釋 Representational:「a representational painting or style of art shows things as they actually appear in real life」(具體的繪畫或藝術風格所顯示的東西,實際出現在真實生活中)
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 論文裡的建議內容。
回想,你如何連上我的 Blog,你可能透過 Browser 直接輸入 blog.kkbruce.net 此域名來到達首頁,也能用書籤或網路上的連結,經點擊後來連上我的 Blog。然後,你想看這一篇名為「REST 入門簡介」的文章,所以以你接下去點擊這文章的標題連結,接去下閱讀。
前段提到「思索與了解 Web 及其工作方式」,我們簡易了解一下整個流程:
Client 的透過 URI 來獲取資源的具體象徵 (Representational)。Client 取得這些具體象徵使這些應用程式轉變其狀態 (以 Browser 而言,取得 HTML、CSS、JavaScript … 來產生畫面),隨著不斷取得資源的具體象徵, Client 端不斷地改變其狀態,這樣不斷的反覆 (iterations ) 過程就是所謂的 Representational State Transfer。
在 HTTP/1.1 RFC 2616 第 5.1.1 Method 一節定義了八大類 HTTP 方法,除了我們常用的 GET 與 POST 之外,在 REST 中常用的還有 PUT 與 DELETE。此 GET, POST, PUT, DELETE 正好可以對應我們 CRUD (Create, Read, Update, Delete) 四種資料操作。
以上表格有沒有很像我們一般在對資料庫表格的操作順序,進入一個 Table 的資料首頁 (通常是列表),此頁面會有「新增、更新、刪除、詳細」等連結,你想進行什麼操作,就點那一個連結。
在 RESTful 每個資源有自己獨立的 URI, Client 從資源集合或單個資源開始進入,不管是資源集合或單個資源,我們都能與 HTTP 方法配合使用,例如,GET 下載,PUT 更新,POST 新增,DELETE 刪除。
再回頭看,前一篇我們範例,我們呼叫 "/api/Products/" 或 "/api/Products/id",再看一次圖十三裡的 URL 與 HTTP 方法:
下一篇我們就會看到整個 CRUD 在 ASP.NET Web API 的實作。
the Design of Network-based Software Architectures》論文,我們先簡單從標題來看,它應該是一種架構樣式 (Architectural Styles) 與軟體架構 (Software Architectures),而且是以網路 (Network-based) 為基礎,重點就是:
- 架構樣式 (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) 來提供。回想,你如何連上我的 Blog,你可能透過 Browser 直接輸入 blog.kkbruce.net 此域名來到達首頁,也能用書籤或網路上的連結,經點擊後來連上我的 Blog。然後,你想看這一篇名為「REST 入門簡介」的文章,所以以你接下去點擊這文章的標題連結,接去下閱讀。
前段提到「思索與了解 Web 及其工作方式」,我們簡易了解一下整個流程:
- 透過 URL ( blog.kkbruce.net ) , Client 向 http://blog.kkbruce.net 發出請求
- blog.kkbruce.net 收到請求,回應首頁給 Client
- Client 又點擊 REST 文章連結 (假設是 http://blog.kkbruce.net/2012/04/...rest.html) 向 http://blog.kkbruce.net 發出 /2012/04/...rest.html 此篇文章的請求
- blog.kkbruce.net 收到請求,回應 REST 文章內容給 Client
Client 的透過 URI 來獲取資源的具體象徵 (Representational)。Client 取得這些具體象徵使這些應用程式轉變其狀態 (以 Browser 而言,取得 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方法 | 資料處理 | 說明 |
---|---|---|
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 方法配合使用。資源 | 資源說明 | GET | PUT | POST | DELETE |
---|---|---|---|---|---|
http://kkbruce.net/Products/ | Products是一組資源集合 | 列出 該組資源集合中每個資源的詳細資訊 | 更新 當前整組資源 | 新增 或附加一個新資源。該操作傳回新資源的URL | 刪除 整組資源 |
http://kkbruce.net/Products/1 | Products/1是單個資源 | 取得 指定的資源的詳細資訊 | 更新 或新增指定的資源 | 新增 或附加一個新元素 | 刪除 指定的元素 |
以上表格有沒有很像我們一般在對資料庫表格的操作順序,進入一個 Table 的資料首頁 (通常是列表),此頁面會有「新增、更新、刪除、詳細」等連結,你想進行什麼操作,就點那一個連結。
在 RESTful 每個資源有自己獨立的 URI, Client 從資源集合或單個資源開始進入,不管是資源集合或單個資源,我們都能與 HTTP 方法配合使用,例如,GET 下載,PUT 更新,POST 新增,DELETE 刪除。
再回頭看,前一篇我們範例,我們呼叫 "/api/Products/" 或 "/api/Products/id",再看一次圖十三裡的 URL 與 HTTP 方法:
圖一:Web API 執行流程 |
參考資料
- REST (wiki)
- 什麼是REST跟RESTful? (ihower)
- 深入浅出REST (infoq 簡中)
- A Brief Introduction to REST (infoq 原文)
- REST and RESTfull web service (石頭閒語)
- RESTful 介面實作示範 (石頭閒語)
- RESTful 服務(配備 WCF)介紹
- RESTful探索系列(黑暗執行緒)
- Architectural Styles and the Design of Network-based Software Architectures ( REST 出處)
- RESTful Web Services Cookbook中文版(infoq mini book) (這裡可以下載到一本免費簡體電子書)
- HTTP/1.1 RFC 2616
沒有留言:
張貼留言
感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。