簡介
當今的應用程式不僅需要和基於瀏覽器的用戶端互操作,還需要和其他應用程式互操作。為實現互通性,web 應用程式通常提供一個 web 服務 API。web 服務 API 通過一個網路(比如 Internet)提供對應用程式 的遠端存取。直到最近,web 服務 API 還使用重型、複雜的基於 SOAP 的 web 服務整合,這種 web 服務,不僅沒有什麼優點,而且還需要很長時間才能實現。帶有基於 Representational State Transfer (REST) 服務的 Rails 架構有一種更簡單、更快捷的方法通過 Active Resource 來實現和使用 web 服務。
在 Rails 實現了 RESTful 以後,現在只需通過一個 Rails 動作就能提供一個特定資源的不同內容類型(或者表示)。這種方法有以下好處:
- 一個資源的各種表示狀態。
- 對不基於瀏覽器的 HTML 用戶端的附加支援在 Controller 視圖中得到了簡化。
- 應用程式之間以及與新用戶端之間的互通性。
在本文中,您將瞭解 REST、SOAP、Rails Active Resource,以及如何提高多個應用程式之間的互通性。
Ruby on Rails
Ruby on Rails(也稱為 Rails 或 RoR)是一個用 Ruby 語言編寫的開源 web 應用程式架構。Ruby on Rails 旨在協助開發人員更輕鬆快捷地開發和部署 web 應用程式,與其他語言和架構相比,Rails 架構進行了幾個假設。其目的是使用敏捷開發的方法,實現快速開發。
Rails 架構合并了以下幾個包:
- Active Record:一個對象關係映射層,用於資料庫相關訪問和功能;
- Action Pack:一個控制器和視圖功能管理器;
- Action Mailer:一個電子郵件處理器;
- Active Support
- Active Resource:提供 web 服務(即 Action Web 服務)。
Web 服務
Web 服務是使用開放協議通訊的應用程式組件,它們可以被其他應用程式使用。web 服務是簡單 APIs ,可以使用 HTML 進行訪問,並在承載請求服務的遠程系統上執行。web 服務是不同平台上、以不同語言編寫、不同系統上的各種應用程式的關鍵整合點。
REST 不是一個協議;它是利用 World Wide Web 的技術和協議的大型連網軟體的一種架構風格。REST 描述如何定義和處理分布式資料對象(或資源),強調簡單的資訊交換和延展性。REST 架構描述該該架構上應用的 6 個約束。
另一方面,SOAP 是一個協議規範,用於在電腦網路中交換 web 服務的實現中的結構化資訊。它依賴 XML 作為其訊息格式,通常依賴其他應用程式層協議(RPC 和 HTTP)進行訊息協商和傳輸。SOAP 可以形成 web 服務合約堆棧的基礎層,提供用於在其上構建 web 服務的基礎訊息傳遞架構。
REST 與 SOAP
下表展示了 REST 和 SOAP 之間的一些區別。
REST 依賴一個單一的應用程式協議(HTTP)、幾個 URI、以及幾種通過 XML 標準化的資料格式。它採用成熟的 HTTP 方法(比如 GET 和 POST)來指揮應用程式。REST 開發人員使用 URI 來建立一個公用基礎,以便應用程式使用 HTTP 和 XML 來共用資料,而不是為應用程式建立一種機器可讀的標準方法來發現和使用遠程系統上的應用程式組件(這是 SOAP 用於 web 服務的方法)。REST 開發人員使用 XML 文檔而不是應用程式方法調用來告訴分布式程式如何相互使用資料。
REST 支援者指出,使用 SOAP 協議直接存取遠程程式的功能必定會遇到 DCOM 和 Common Object Request Broker Architecture 等之前分散式運算架構所遇到的互通性問題。
Active Resource
在對 web 應用程式在伺服器和客戶機應用程式之間的通訊採用 RESTful 方法之前,SOAP 和其他 XML-RPC 形式被用於通過一個 API 進行通訊。Rails 2 引入的 Active Resource 替代了 Action Web Service。Active Resource 完全理解 RESTful 路由和 XML 表示。它是一個類,用於將 RESTful 資源地圖為 Rails 應用程式中的模型。Active Resource 提供一些工具來快速、輕鬆地使用遵守 Rails RESTful URI 結構和協議約定的基於 REST 的 web 服務。Active Resource 將來自任何合格服務的響應映射到富 Ruby 對象。Active Resource 還提供輕鬆執行基本的 CRUD 功能需要的全部生命週期方法。
CRUD 操作分別對應 HTTP 方法 POST、GET、PUT 和 DELETE。而且,Active Resource 對這些 HTTP 方法中的每個方法都有一個方法。它們接收與 CRUD 相同的參數,但返回收到的 XML 的一個雜湊表。Active Resource 對象本質上是 REST 網頁伺服器的前端。它通過向伺服器回調 HTTP 調用並將 XML 結果解析回一個 Ruby 對象中來擷取並修改它的資料。
清單 1 展示了一個最小 Active Resource 樣本。假設有一個圖書館應用程式,每個類別作為一個不同的用戶端,且 Indian History 是其中一個類別。
清單 1. Active Resource 樣本
class IndianHistory < ActiveResource::Baseself.site = “http://indian-history.com”end
ActiveResource 擁有與 Active Record 相同的方法。在上面的代碼範例中,類 IndianHistory 正繼承自 ActiveResource Base。在第二行中,self.site 持有包含 IndianHistory 圖書的 URI 的網站值。在本例中,這個 URI 是 http://indian-history.com(假設這個 URI 是帶有必要模型和控制器動作的另一個 Rails 應用程式)。
現在,這個類被映射到網站值定位的 RESTful 資源,您現在可以操作 IndianHistory 類的資源。要擷取 Indian History 下的所有圖書列表,您將調用它的 find 方法,它類似於 Active Record find 方法。
>> books = IndianHistory.find (:all)
這個 Active Resource 模組類似於 Active Record 模組;它們擁有相同的風格。
假設您正在尋找標題為 “Akbar” 的圖書,可以使用以下代碼:
>> books = IndianHistory.find(:all, :params => { :title => “Akbar”}}
與 Active Record find 方法中的常規 :conditions 子句不同,本樣本使用了 :params,且 URL 是 GET http://indian-history.com/indian_histories.xml?title=Akbar。
Active Resource 不僅限於檢索資料。您可以使用所有 CRUD 操作。在指令碼/控制台中,您可以使用:
>> IndianHistory.create (:title => “Jhansi Stories”, :amount => 233.00, :available => 0)
上述程式碼將使用提供的資料向 create 動作中存在清單 2 中的代碼的控制器建立一個 HTTP POST。
清單 2. Create
class IndianHistoryController < ActiveResource::Basedef create@book = IndianHistory.new (params [:indian_history])respond_to do |format|if @book.saveflash[:notice] = “New title added successfully” format.html { redirect_to(@book) }format.xml { render :xml => @book, :status => :created}elseformat.html { render :action => “new” }format.xml { render :xml => @book.errors, :status => :unprocessable_entity}endendendend
如果圖書記錄成功儲存,將返回新建立的、狀態代碼為 HTTP 201 的記錄,並將使用新建立的記錄重新導向視圖。
同樣,您也可以更新和刪除記錄,主要您擁有執行管理的許可權和訪問權。
對於 Update 操作,在指令碼/控制台中使用:
清單 3. Update
>> book= IndianHistory.find (2)>> book.available = 1>> book.save >> book = IndianHistory.find (2)>> book.available # => 1
您更新了圖書的可用性並儲存記錄。ActiveResource 和 ActiveRecord 之間有一個細微差別:ActiveResource 中沒有方法 save 和 update。
最後,下面的語句將從資料庫移除記錄。
>> IndianHistory.delete(2)
除了上面介紹的基本操作外,Active Resource 還允許通過設定一個 HTTP 頭部來 支援 HTTP 基本驗證。假如使用者名稱和密碼被設定且在身分識別驗證失敗時拋出錯誤,則客戶機和伺服器串連的安全檢查就能通過每個串連上的 Active Resource 身分識別驗證來完成。基本的身分識別驗證也可以輕鬆實現。
結束語
在本文中,您瞭解了 web 服務、REST、SOAP 和 Rails Active Resource。一個簡單的樣本向您展示了 CRUD 操作。
Ruby on Rails Active Resource 包以一種 RESTful 方式提供多個 web 應用程式之間的輕鬆通訊。除了 CRUD 操作外,它還允許您建立自訂動作。