Ruby Web Services 應用– 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 Services的方法,如下我們定義兩個方法,一個是兩個數相加,一個是兩個數相除:
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 | 參數名和參數模式 |
為了理解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) ])
第四步- 開啟服務
最後我們通過實例化派生類,並調用start 方法來啟動服務:
myServer = MyServer.new('ServerName', 'urn:ruby:ServiceName', hostname, port) myServer.start
以下是請求參數的說明:
參數 | 描述 |
---|---|
ServerName | 服務名,你可以取你喜歡的 |
urn:ruby:ServiceName | Hereurn:ruby是固定的,但是你可以為你的服務取一個唯一的ServiceName |
hostname | 指定主機名 |
port | 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
執行以上程序後,就啟動了一個監聽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 Services 。 如果你想了解更多可以查看官方文檔: Ruby的Web Services