English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Das einfache Objektzugriffsprotokoll (SOAP, in voller Form Simple Object Access Protocol) ist eine Protokollspezifikation für den Datenaustausch.
SOAP ist ein einfaches Protokoll, das auf XML basiert und Anwendungen ermöglicht, Informationen über HTTP auszutauschen.
Das einfache Objektzugriffsprotokoll ist eine Protokollspezifikation für den Datenaustausch, eine leichte und einfache Protokollspezifikation, die auf XML (eine Untergruppe des Standard Generalized Markup Language) basiert und für den Austausch strukturierter und fester Informationen im Web entworfen wurde.
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 支持两种不同的服务类型:
基于 CGI/FastCGI 服务 (SOAP::RPC::CGIStub)
独立服务 (SOAP::RPC:StandaloneServer)
本教程将为大家介绍如何建立独立的 SOAP 服务。步骤如下:
为了实现自己的独立的服务器,你需要编写一个新的类,该类为 SOAP::RPC::StandaloneServer 的子类:
class MyServer < SOAP::RPC::StandaloneServer ............. 结束
注意:如果你要编写一个基于FastCGI的服务器,那么你需要继承 SOAP::RPC::CGIStub 类,程序的其余部分将保持不变。
接下来我们定义Web Service的方法,如下我们定义两个方法,一个是两个数相加,一个是两个数相除:
class MyServer < SOAP::RPC::StandaloneServer ............. # 处理方法 def add(a, b) return a + b 结束 def div(a, b) return a / b 结束 结束
接下来添加我们在服务器上定义的方法,initialize方法是公开的,用于外部的连接:
class MyServer < SOAP::RPC::StandaloneServer def initialize(*args) add_method(receiver, inoutParam, *paramArg) 结束 结束
以下是各参数的说明:
Parameter | Beschreibung |
---|---|
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 结束
公开的调用方法如下:
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
以下是请求参数的说明:
Parameter | Beschreibung |
---|---|
ServerName | 服务名,你可以取你喜欢的 |
urn:ruby:ServiceName | Hier urn:ruby 是固定的,但是你可以为你的服务取一个唯一的 ServiceName |
hostname | 指定主机名 |
port | web 服务端口 |
接下来我们通过以上的步骤,创建一个独立的服务:
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') 结束 # Handler methods def add(a, b) return a + b 结束 def div(a, b) return a / b 结束 结束 server = MyServer.new("MyServer", 'urn:ruby:calculation', 'localhost', 8080) trap('INT') { server.shutdown } server.start rescue => err puts err.message 结束
执行以上程序后,就启动了一个监听 8080 端口的本地服务,并公开两个方法:add 和 div。
Sie können diesen Dienst auch im Hintergrund ausführen:
$ ruby MyServer.rb &
Mit der Klasse SOAP::RPC::Driver wird in Ruby ein SOAP-Client entwickelt. Lassen Sie uns nun detailliert die Verwendung der Klasse SOAP::RPC::Driver betrachten.
Für den Aufruf des SOAP-Dienstes sind folgende Informationen erforderlich:
Adresse der SOAP-Dienst-URL (SOAP Endpoint URL)
NameSpace der Dienstmethode (Method Namespace URI)
Name der Dienstmethode und Parameterinformationen
Nun erstellen wir Schritt für Schritt den SOAP-Client, um die oben genannten SOAP-Methoden aufzurufen: add, div:
Wir können die SOAP::RPC::Driver-Klasse durch Beispielisierung aufrufen, wie folgt:
SOAP::RPC::Driver.new(endPoint, nameSpace, soapAction)
Nachfolgend ist die Beschreibung der Parameter:
Parameter | Beschreibung |
---|---|
endPoint | Adresse der URL des Verbindungsprotokolls für den SOAP-Dienst |
nameSpace | NameSpace wird für alle RPC des SOAP::RPC::Driver-Objekts verwendet. |
soapAction | Wird als Wert des SOAPAction-Feldes im HTTP-Header verwendet. Wenn es ein leerer String "" ist, wird standardmäßig nil |
Um SOAP-Dienstmethoden für SOAP::RPC::Driver hinzuzufügen, können wir den Beispielaufruf SOAP::RPC::Driver verwenden, um die folgenden Methoden aufzurufen:
driver.add_method(name, *paramArg)
Nachfolgend ist die Beschreibung der Parameter:
Parameter | Beschreibung |
---|---|
name | Name der Methode des Remote-Web-Dienstes |
paramArg | Parameter des Remote-Programms angeben |
Schließlich können wir den Beispielaufruf von SOAP::RPC::Driver verwenden, um den SOAP-Dienst aufzurufen:
result = driver.serviceMethod(paramArg...)
serviceMethod ist der tatsächliche Methodenname des SOAP-Dienstes, paramArg ist die Parameterliste der Methode.
Basierend auf diesen Schritten können wir den folgenden SOAP-Client schreiben:
#!/usr/bin/ruby -w require 'soap'/rpc/driver' NAMESPACE = 'urn:ruby:calculation' URL = 'http://localhost:8080/' begin driver = SOAP::RPC::Driver.new(URL, NAMESPACE) # 添加远程服务方法 driver.add_method('add', 'a', 'b') # 调用远程服务方法 puts driver.add(20, 30) rescue => err puts err.message 结束
以上我们只是简单介绍了 Ruby 的 Web Service。 如果您想了解更多,可以查看官方文档:Ruby 的 Web Service