Ruby Web Service 應用 – SOAP4R

Ruby Web Service 應用 - SOAP4R


什麼是 SOAP?

簡單物件訪問協議(SOAP,全寫為Simple Object Access Protocol)是交換資料的一種協議規範。

SOAP 是一種簡單的基於 XML 的協議,它使應用程式通過 HTTP 來交換資訊。

簡單物件訪問協議是交換資料的一種協議規範,是一種輕量的、簡單的、基於XML(標準通用標記語言下的一個子集)的協議,它被設計成在WEB上交換結構化的和固化的資訊。

更多 SOAP 教程請檢視:http://www.w3cschool.cc/soap/soap-tutorial.html。


SOAP4R 安裝

SOAP4R 由Hiroshi Nakamura開發實現,用於 Ruby 的 SOAP 應用。

SOAP4R 下載地址:http://raa.ruby-lang.org/project/soap4r/。

注意:你的ruby環境可能已經安裝了該該元件。

Linux 環境下你也可以使用 gem 來安裝該元件,命令如下:

gem install soap4r --include-dependencies

如果你是window環境下開發,你需要下載zip壓縮檔案,並通過執行 install.rb 來安裝。


SOAP4R 服務

SOAP4R 支援兩種不同的服務型別:

  • 基於 CGI/FastCGI 服務 (SOAP::RPC::CGIStub)
  • 獨立服務 (SOAP::RPC:StandaloneServer)

本教程將為大家介紹如何建立獨立的 SOAP 服務。步驟如下:

第1步 - 繼承SOAP::RPC::StandaloneServer

為了實現自己的獨立的伺服器,你需要編寫一個新的類,該類為 SOAP::RPC::StandaloneServer 的子類:

class MyServer < SOAP::RPC::StandaloneServer ............... end

注意:如果你要編寫一個基於FastCGI的伺服器,那麼你需要繼承 SOAP::RPC::CGIStub 類,程式的其餘部分將保持不變。

第二步 - 定義處理方法

接下來我們定義Web Service的方法,如下我們定義兩個方法,一個是兩個數相加,一個是兩個數相除:

class MyServer < SOAP::RPC::StandaloneServer ............... # 處理方法 def add(a, b) return a + b end def div(a, b) return a / b end end

第三步 - 公佈處理方法

接下來新增我們在伺服器上定義的方法,initialize方法是公開的,用於外部的連線:

class MyServer < SOAP::RPC::StandaloneServer def initialize(*args) add_method(receiver, methodName, *paramArg) end end

以下是各引數的說明:

引數描述
receiver包含方法名的方法的物件。 如果你在同一個類中定義服務方法,該引數為 self
methodName 呼叫 RPC 請求的方法名。
paramArg引數名和引數模式

為了理解 inoutout 引數,考慮以下服務方法,需要輸入兩個引數: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) ])

第四步 - 開啟服務

最後我們通過例項化派生類,並呼叫 start 方法來啟動服務:

myServer = MyServer.new('ServerName', 'urn:ruby:ServiceName', hostname, port) myServer.start

以下是請求引數的說明:

引數描述
ServerName服務名,你可以取你喜歡的
urn:ruby:ServiceNameHere urn:ruby 是固定的,但是你可以為你的服務取一個唯一的 ServiceName
hostname指定主機名
portweb 服務埠

例項

接下來我們通過以上的步驟,建立一個獨立的服務:

例項

require "soap/rpc/standaloneserver" begin class MyServer < SOAP::RPC::StandaloneServer # Expose our service 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

執行以上程式後,就啟動了一個監聽 8080 埠的本地服務,並公開兩個方法:add 和 div。

你可以再後臺執行以上服務:

$ ruby MyServer.rb &

SOAP4R 客戶端

ruby 中使用 SOAP::RPC::Driver 類開發 SOAP 客戶端。接下來我們來詳細看下 SOAP::RPC::Driver 類的使用。

呼叫 SOAP 服務需要以下資訊:

  • SOAP 服務 URL 地址 (SOAP Endpoint URL)
  • 服務方法的名稱空間(Method Namespace URI)
  • 服務方法名及引數資訊

接下來我們就一步步來建立 SOAP 客戶端來呼叫以上的 SOAP 方法:add 、 div:

第一步 - 建立 SOAP Driver 例項

我們可以通過例項化 SOAP::RPC::Driver 類來呼叫它的新方法,如下所示:

SOAP::RPC::Driver.new(endPoint, nameSpace, soapAction)

以下是引數的描述:

引數描述
endPoint連線 SOAP 服務的 URL 地址
nameSpace 名稱空間用於 SOAP::RPC::Driver 物件的所有 RPC .
soapAction用於 HTTP 頭部的 SOAPAction 欄位值。如果是字串是"" 則預設為 nil

第二步 - 新增服務方法

為 SOAP::RPC::Driver 新增 SOAP 服務方法,我們可以通過例項 SOAP::RPC::Driver 來呼叫以下方法:

driver.add_method(name, *paramArg)

以下是引數的說明:

引數描述
name遠端web服務的方法名
paramArg 指定遠端程式的引數

第三步 - 呼叫SOAP服務

最後我們可以使用 SOAP::RPC::Driver 例項來呼叫 SOAP 服務:

result = driver.serviceMethod(paramArg...)

serviceMethod SOAP服務的實際方法名,paramArg為方法的引數列表。

例項

基於以上的步驟,我們可以編寫以下的 SOAP 客戶端:

例項

#!/usr/bin/ruby -w require 'soap/rpc/driver' NAMESPACE = 'urn:ruby:calculation' URL = 'http://localhost: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 Service 。 如果你想了解更多可以檢視官方文件:Ruby 的 Web Service