簡單對(duì)象訪問協(xié)議(SOAP,全寫為Simple Object Access Protocol)是交換數(shù)據(jù)的一種協(xié)議規(guī)范。
SOAP 是一種簡單的基于 XML 的協(xié)議,它使應(yīng)用程序通過 HTTP 來交換信息。
簡單對(duì)象訪問協(xié)議是交換數(shù)據(jù)的一種協(xié)議規(guī)范,是一種輕量的、簡單的、基于XML(標(biāo)準(zhǔn)通用標(biāo)記語言下的一個(gè)子集)的協(xié)議,它被設(shè)計(jì)成在WEB上交換結(jié)構(gòu)化的和固化的信息。
更多 SOAP 教程請(qǐng)查看:http://www.vxbq.cn/s/soap/soap-intro.html。
SOAP4R 由Hiroshi Nakamura開發(fā)實(shí)現(xiàn),用于 Ruby 的 SOAP 應(yīng)用。
SOAP4R 下載地址:http://raa.ruby-lang.org/soap4r/。
注意:你的ruby環(huán)境可能已經(jīng)安裝了該該組件。
Linux 環(huán)境下你也可以使用 gem 來安裝該組件,命令如下:
$ gem install soap4r --include-dependencies
如果你是window環(huán)境下開發(fā),你需要下載zip壓縮文件,并通過執(zhí)行 install.rb 來安裝。
SOAP4R 支持兩種不同的服務(wù)類型:
本教程將為大家介紹如何建立獨(dú)立的 SOAP 服務(wù)。步驟如下:
為了實(shí)現(xiàn)自己的獨(dú)立的服務(wù)器,你需要編寫一個(gè)新的類,該類為 SOAP::RPC::StandaloneServer 的子類:
class MyServer < SOAP::RPC::StandaloneServer ............... end
注意:如果你要編寫一個(gè)基于FastCGI的服務(wù)器,那么你需要繼承 SOAP::RPC::CGIStub 類,程序的其余部分將保持不變。
接下來我們定義Web Services的方法,如下我們定義兩個(gè)方法,一個(gè)是兩個(gè)數(shù)相加,一個(gè)是兩個(gè)數(shù)相除:
class MyServer < SOAP::RPC::StandaloneServer ............... # 處理方法 def add(a, b) return a + b end def div(a, b) return a / b end end
接下來添加我們?cè)诜?wù)器上定義的方法,initialize方法是公開的,用于外部的連接:
class MyServer < SOAP::RPC::StandaloneServer def initialize(*args) add_method(receiver, methodName, *paramArg) end end
以下是各參數(shù)的說明:
參數(shù) | 描述 |
---|---|
receiver | 包含方法名的方法的對(duì)象。 如果你在同一個(gè)類中定義服務(wù)方法,該參數(shù)為 self。 |
methodName | 調(diào)用 RPC 請(qǐng)求的方法名。 |
paramArg | 參數(shù)名和參數(shù)模式 |
為了理解 inout 和 out 參數(shù),考慮以下服務(wù)方法,需要輸入兩個(gè)參數(shù):inParam 和 inoutParam,函數(shù)執(zhí)行完成后返回三個(gè)值:retVal、inoutParam 、outParam:
def aMeth(inParam, inoutParam) retVal = inParam + inoutParam outParam = inParam . inoutParam inoutParam = inParam * inoutParam return retVal, inoutParam, outParam end
公開的調(diào)用方法如下:
add_method(self, 'aMeth', [ %w(in inParam), %w(inout inoutParam), %w(out outParam), %w(retval return) ])
最后我們通過實(shí)例化派生類,并調(diào)用 start 方法來啟動(dòng)服務(wù):
myServer = MyServer.new('ServerName', 'urn:ruby:ServiceName', hostname, port) myServer.start
以下是請(qǐng)求參數(shù)的說明:
參數(shù) | 描述 |
---|---|
ServerName | 服務(wù)名,你可以取你喜歡的 |
urn:ruby:ServiceName | Here urn:ruby 是固定的,但是你可以為你的服務(wù)取一個(gè)唯一的 ServiceName |
hostname | 指定主機(jī)名 |
port | web 服務(wù)端口 |
接下來我們通過以上的步驟,創(chuàng)建一個(gè)獨(dú)立的服務(wù):
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
執(zhí)行以上程序后,就啟動(dòng)了一個(gè)監(jiān)聽 8080 端口的本地服務(wù),并公開兩個(gè)方法:add 和 div。
你可以再后臺(tái)執(zhí)行以上服務(wù):
$ ruby MyServer.rb&
ruby 中使用 SOAP::RPC::Driver 類開發(fā) SOAP 客戶端。接下來我們來詳細(xì)看下 SOAP::RPC::Driver 類的使用。
調(diào)用 SOAP 服務(wù)需要以下信息:
接下來我們就一步步來創(chuàng)建 SOAP 客戶端來調(diào)用以上的 SOAP 方法:add 、 div:
我們可以通過實(shí)例化 SOAP::RPC::Driver 類來調(diào)用它的新方法,如下所示:
SOAP::RPC::Driver.new(endPoint, nameSpace, soapAction)
以下是參數(shù)的描述:
參數(shù) | 描述 |
---|---|
endPoint | 連接 SOAP 服務(wù)的 URL 地址 |
nameSpace | 命名空間用于 SOAP::RPC::Driver 對(duì)象的所有 RPC . |
soapAction | 用于 HTTP 頭部的 SOAPAction 字段值。如果是字符串是"" 則默認(rèn)為 nil |
為 SOAP::RPC::Driver 添加 SOAP 服務(wù)方法,我們可以通過實(shí)例 SOAP::RPC::Driver 來調(diào)用以下方法:
driver.add_method(name, *paramArg)
以下是參數(shù)的說明:
參數(shù) | 描述 |
---|---|
name | 遠(yuǎn)程web服務(wù)的方法名 |
paramArg | 指定遠(yuǎn)程程序的參數(shù) |
最后我們可以使用 SOAP::RPC::Driver 實(shí)例來調(diào)用 SOAP 服務(wù):
result = driver.serviceMethod(paramArg...)
serviceMethod SOAP服務(wù)的實(shí)際方法名,paramArg為方法的參數(shù)列表。
基于以上的步驟,我們可以編寫以下的 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