English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Ruby Web Service Anwendung SOAP4R

Was ist SOAP?

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 安装

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
  .............
结束

注意:如果你要编写一个基于FastCGI的服务器,那么你需要继承 SOAP::RPC::CGIStub 类,程序的其余部分将保持不变。

Zweiter Schritt - 定义处理方法

接下来我们定义Web Service的方法,如下我们定义两个方法,一个是两个数相加,一个是两个数相除:

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

Dritter Schritt - 公布处理方法

接下来添加我们在服务器上定义的方法,initialize方法是公开的,用于外部的连接:

class MyServer < SOAP::RPC::StandaloneServer
   def initialize(*args)
      add_method(receiver, inoutParam, *paramArg)
   结束
结束

以下是各参数的说明:

ParameterBeschreibung
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
结束

公开的调用方法如下:

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

以下是请求参数的说明:

ParameterBeschreibung
ServerName服务名,你可以取你喜欢的
urn:ruby:ServiceNameHier urn:ruby 是固定的,但是你可以为你的服务取一个唯一的 ServiceName
hostname指定主机名
portweb 服务端口

Online-Beispiel

接下来我们通过以上的步骤,创建一个独立的服务:

Online-Beispiel

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 &

SOAP4R-Client

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:

Erster Schritt - Erstellen Sie ein Beispiel für den SOAP Driver

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:

ParameterBeschreibung
endPointAdresse der URL des Verbindungsprotokolls für den SOAP-Dienst
nameSpaceNameSpace wird für alle RPC des SOAP::RPC::Driver-Objekts verwendet.
soapActionWird als Wert des SOAPAction-Feldes im HTTP-Header verwendet. Wenn es ein leerer String "" ist, wird standardmäßig nil

Zweiter Schritt - Fügen Sie Dienstmethoden hinzu

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:

ParameterBeschreibung
nameName der Methode des Remote-Web-Dienstes
paramArgParameter des Remote-Programms angeben

Dritter Schritt - Aufruf des SOAP-Dienstes

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.

Online-Beispiel

Basierend auf diesen Schritten können wir den folgenden SOAP-Client schreiben:

Online-Beispiel

#!/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