什麼是統一介面?

李錕發表於2012-01-23

答:REST與另外兩種分散式應用架構風格DO(分散式物件)、RPC(遠端過程呼叫)的主要區別,在於它要求必須以統一的介面來對資源執行各種操作。這個統一介面正是由HTTP 1.1協議(RFC2616)來定義的,這也正是設計HTTP 1.1協議的主要目的。由HTTP 1.1協議定義的統一介面包括了以下的內容: a. 用來與資源互動的6個標準的HTTP方法:GET/POST/PUT/DELETE/HEAD/OPTIONS(在RFC2616中還定義了其他幾個方法,但是這幾個方法不是用來與資源互動的)。最常用的是前面的GET/POST/PUT/DELETE這4個方法。 b. 一些標準的HTTP頭資訊欄位(HTTP header fields)。頭資訊欄位在HTTP訊息中以名稱-值對的形式出現,分為通用頭資訊(general header fields)、請求頭資訊(request header fields)、響應頭資訊(response header fields)、實體頭資訊(entity header fields)4種類別,用來完整表達HTTP訊息的操作語義,或者對訊息的安全性、快取等方面加以控制。詳情請看RFC2616。 c. 一些標準的HTTP響應狀態程式碼(status codes)。其中100-199代表臨時性的響應,僅僅用在與客戶端-伺服器端握手協商的階段;200-299代表請求成功完成;300-399代表請求應該重定向;400-499代表因客戶端錯誤導致的請求無法完成;500-599代表因伺服器端錯誤導致的請求無法完成。詳情請看RFC2616。 d. 一套通用的訪問身份認證框架(general framework for access authentication)。推薦的兩種可選的身份認證機制HTTP Basic Authentication和HTTP Digest Authentication,定義在RFC2617(HTTP Authentication: Basic and Digest Access Authentication)中。 e. 在客戶端-伺服器端之間用來確定資源表述格式的標準的內容協商(content negotiation)機制。 f. 對於HTTP響應訊息體(message body)的標準的快取機制,包括了兩種快取模型:過期模型(expiration model)和驗證模型(validation model)。

對於以上所述的統一介面內容,需要補充以下一些注意事項: a. 對於一個特定的資源,客戶端應用可以執行的操作是有限的。讓一個資源(一個URI)承擔過多的職責,這是一種錯誤的設計。不必擔心定義更多的資源(更多的URI)有什麼問題,這對Web應用的可伸縮性來說只有好處沒有壞處。 b. 按照HTTP 1.1協議的規定:GET方法是安全的且冪等的,PUT/DELETE方法是不安全的但是冪等的,而POST方法是既不安全也不冪等的。嚴格遵守HTTP協議的這個規定,是非常重要的。“人有多大膽、地有多大產”的做法(例如:使用GET請求對資源執行所有操作)只會帶來災難性的後果。 c. 將GET/POST/PUT/DELETE這4種方法對映為針對資源的CRUD操作,只是一種最為常見的設計模式(因為Ruby on Rails而流行開來),這種設計模式並不是REST或者HTTP 1.1協議強制要求的。 d. 統一介面的要求不僅僅適用於HTTP通訊鏈條兩端的user agent和origin server,還普遍適用於通訊鏈條中的所有中間元件(intermediary components)。某個中間元件與其直接相鄰元件之間的互動,也必須使用相同的統一介面。 e. 按照REST的要求,應該儘量確保操作語義對於HTTP通訊鏈條上中間元件的可見性,因此操作的語義必須由HTTP頭資訊來完全表達。 f. 除了HTTP 1.1協議中定義的這些標準的頭資訊欄位外,在必要的時候,應用也可以使用自定義的頭資訊欄位。不過,當與防火牆打交道時,需要確保防火牆不至於因無法理解這些自定義的頭資訊欄位,而禁止其所屬的HTTP訊息的收發。 g. 除了HTTP 1.1協議中定義的這些標準的響應狀態程式碼外,在必要的時候,應用也可以使用自定義的響應狀態程式碼,以代表某些自定義的出錯狀態。 h. HTTP 1.1協議在安全性方面的設計相當靈活。它定義了一套基於質詢-響應(challenge-response)過程的通用的訪問身份認證框架,而不是強制應用使用某種特定的身份認證機制。除了推薦的兩種身份認證機制Basic和Digest外,應用系統可以很靈活地插入自定義的認證機制(例如:插入基於LDAP的認證機制)。只要仍然遵循HTTP 1.1協議定義的這個通用的訪問身份認證框架,就不會破壞REST所要求的統一介面和操作語義對於中間元件的可見性。 i. 統一介面保證了操作語義對於中間元件的可見性,正因為如此,才有可能對HTTP訊息進行高效的快取。快取是改善網路呼叫讀操作效能的關鍵,HTTP 1.1協議為實現快取提供了非常完善的機制。快取可以在HTTP通訊鏈條的很多地方實現,例如user agent、http proxy、reverse proxy server、origin server等等。

相關文章