- Ruby 基礎
- Ruby - 首頁
- Ruby - 概述
- Ruby - 環境搭建
- Ruby - 語法
- Ruby - 類和物件
- Ruby - 變數
- Ruby - 運算子
- Ruby - 註釋
- Ruby - IF...ELSE
- Ruby - 迴圈
- Ruby - 方法
- Ruby - 程式碼塊
- Ruby - 模組
- Ruby - 字串
- Ruby - 陣列
- Ruby - 雜湊表
- Ruby - 日期和時間
- Ruby - 範圍
- Ruby - 迭代器
- Ruby - 檔案 I/O
- Ruby - 異常
Ruby Web 服務 - SOAP4R
什麼是 SOAP?
簡單物件訪問協議 (SOAP) 是一種跨平臺且與語言無關的基於 XML 的 RPC 協議,通常(但並非總是)基於 HTTP。
它使用 XML 編碼進行遠端過程呼叫的資訊,並使用 HTTP 透過網路在客戶端和伺服器之間傳輸這些資訊。
與其他技術(如 COM、CORBA 等)相比,SOAP 具有若干優勢:例如,其相對較低的部署和除錯成本、其可擴充套件性和易用性,以及針對不同語言和平臺的多種實現。
請參考我們簡單的教程 SOAP 以詳細瞭解它。
本章使您熟悉 Ruby 的 SOAP 實現 (SOAP4R)。這是一個基本的教程,因此,如果您需要深入瞭解,則需要參考其他資源。
安裝 SOAP4R
SOAP4R 是由 Nakamura Hiroshi 開發的 Ruby 的 SOAP 實現,可以從以下地址下載 -
注意 - 您很有可能已經安裝了此元件。
Download SOAP
如果您熟悉 gem 工具,則可以使用以下命令安裝 SOAP4R 和相關軟體包。
$ gem install soap4r --include-dependencies
如果您在 Windows 上工作,則需要從上述位置下載一個壓縮檔案,並需要使用標準安裝方法透過執行ruby install.rb來安裝它。
編寫 SOAP4R 伺服器
SOAP4R 支援兩種不同型別的伺服器 -
- 基於 CGI/FastCGI (SOAP::RPC::CGIStub)
- 獨立伺服器 (SOAP::RPC:StandaloneServer)
本章詳細介紹瞭如何編寫獨立伺服器。編寫 SOAP 伺服器涉及以下步驟。
步驟 1 - 繼承 SOAP::RPC::StandaloneServer 類
要實現您自己的獨立伺服器,您需要編寫一個新類,該類將作為SOAP::StandaloneServer的子類,如下所示 -
class MyServer < SOAP::RPC::StandaloneServer ............... end
注意 - 如果您想編寫基於 FastCGI 的伺服器,則需要將SOAP::RPC::CGIStub作為父類,其餘步驟將保持不變。
步驟 2 - 定義處理程式方法
第二步是編寫您希望公開給外部世界的 Web 服務方法。
它們可以編寫為簡單的 Ruby 方法。例如,讓我們編寫兩個方法來新增兩個數字和除以兩個數字 -
class MyServer < SOAP::RPC::StandaloneServer
...............
# Handler methods
def add(a, b)
return a + b
end
def div(a, b)
return a / b
end
end
步驟 3 - 公開處理程式方法
下一步是將我們定義的方法新增到我們的伺服器中。initialize方法用於使用以下兩種方法之一公開服務方法 -
class MyServer < SOAP::RPC::StandaloneServer
def initialize(*args)
add_method(receiver, methodName, *paramArg)
end
end
以下是引數的說明 -
| 序號 | 引數及描述 |
|---|---|
| 1 | 接收者 包含 methodName 方法的物件。您在與 methodDef 方法相同的類中定義服務方法,此引數為self。 |
| 2 | 方法名稱 由於 RPC 請求而呼叫的方法的名稱。 |
| 3 | 引數 指定(如果給出)引數名稱和引數模式。 |
要了解inout或out引數的用法,請考慮以下服務方法,該方法採用兩個引數(inParam 和 inoutParam),返回一個正常的返回值(retVal)以及另外兩個引數:inoutParam和outParam -
def aMeth(inParam, inoutParam) retVal = inParam + inoutParam outParam = inParam . inoutParam inoutParam = inParam * inoutParam return retVal, inoutParam, outParam end
現在,我們可以公開此方法,如下所示 -
add_method(self, 'aMeth', [ %w(in inParam), %w(inout inoutParam), %w(out outParam), %w(retval return) ])
步驟 4 - 啟動伺服器
最後一步是透過例項化派生類的一個例項並呼叫start方法來啟動伺服器。
myServer = MyServer.new('ServerName', 'urn:ruby:ServiceName', hostname, port)
myServer.start
以下是所需引數的說明 -
| 序號 | 引數及描述 |
|---|---|
| 1 | 伺服器名稱 伺服器名稱,您可以隨意命名。 |
| 2 | urn:ruby:ServiceName 這裡urn:ruby是常量,但您可以為此伺服器提供唯一的 ServiceName 名稱。 |
| 3 | 主機名 指定此伺服器將監聽的主機名。 |
| 4 | 埠 要用於 Web 服務的可用埠號。 |
示例
現在,使用上述步驟,讓我們編寫一個獨立伺服器 -
require "soap/rpc/standaloneserver"
begin
class MyServer < SOAP::RPC::StandaloneServer
# Expose our services
def initialize(*args)
add_method(self, 'add', 'a', 'b')
add_method(self, 'div', 'a', 'b')
end
# Handler methods
def add(a, b)
return a + b
end
def div(a, b)
return a / b
end
end
server = MyServer.new("MyServer",
'urn:ruby:calculation', 'localhost', 8080)
trap('INT){
server.shutdown
}
server.start
rescue => err
puts err.message
end
執行後,此伺服器應用程式在localhost上啟動一個獨立的 SOAP 伺服器,並在埠8080 上監聽請求。它公開了兩個服務方法,add和div,它們接受兩個引數並返回結果。
現在,您可以如下所示在後臺執行此伺服器 -
$ ruby MyServer.rb&
編寫 SOAP4R 客戶端
SOAP::RPC::Driver類提供對編寫 SOAP 客戶端應用程式的支援。本章介紹了此類,並根據應用程式演示了其用法。
以下是呼叫 SOAP 服務所需的最低限度資訊 -
- SOAP 服務的 URL(SOAP 端點 URL)。
- 服務方法的名稱空間(方法名稱空間 URI)。
- 服務方法的名稱及其引數。
現在,我們將編寫一個 SOAP 客戶端,它將呼叫上面示例中定義的服務方法,名為add和div。
以下是建立 SOAP 客戶端的主要步驟。
步驟 1 - 建立 SOAP 驅動程式例項
我們透過呼叫其 new 方法建立SOAP::RPC::Driver的例項,如下所示 -
SOAP::RPC::Driver.new(endPoint, nameSpace, soapAction)
以下是所需引數的說明 -
| 序號 | 引數及描述 |
|---|---|
| 1 | 端點 要連線的 SOAP 伺服器的 URL。 |
| 2 | 名稱空間 為此 SOAP::RPC::Driver 物件完成的所有 RPC 使用的名稱空間。 |
| 3 | soapAction HTTP 標頭的 SOAPAction 欄位的值。如果為 nil,則預設為空字串 ""。 |
步驟 2 - 新增服務方法
要將 SOAP 服務方法新增到SOAP::RPC::Driver,我們可以使用SOAP::RPC::Driver例項呼叫以下方法 -
driver.add_method(name, *paramArg)
以下是引數的說明 -
| 序號 | 引數及描述 |
|---|---|
| 1 | 名稱 遠端 Web 服務方法的名稱。 |
| 2 | 引數 指定遠端過程的引數名稱。 |
步驟 3 - 呼叫 SOAP 服務
最後一步是使用SOAP::RPC::Driver例項呼叫 SOAP 服務,如下所示 -
result = driver.serviceMethod(paramArg...)
這裡serviceMethod是實際的 Web 服務方法,paramArg...是要傳遞給服務方法的引數列表。
示例
根據上述步驟,我們將編寫一個 SOAP 客戶端,如下所示 -
#!/usr/bin/ruby -w
require 'soap/rpc/driver'
NAMESPACE = 'urn:ruby:calculation'
URL = 'https://:8080/'
begin
driver = SOAP::RPC::Driver.new(URL, NAMESPACE)
# Add remote sevice methods
driver.add_method('add', 'a', 'b')
# Call remote service methods
puts driver.add(20, 30)
rescue => err
puts err.message
end
進一步閱讀
我已經向您解釋了 Ruby Web 服務的非常基本的概念。如果您想進一步深入研究,則可以透過以下連結找到有關Ruby Web 服務的更多詳細資訊。