使用 Ruby 的 Web 服务 - SOAP4R


什么是 SOAP?

简单对象访问协议 (SOAP) 是一种跨平台且与语言无关的 RPC 协议,基于 XML,通常(但不一定)基于 HTTP。

它使用 XML 对进行远程过程调用的信息进行编码,并使用 HTTP 通过网络将该信息从客户端传输到服务器,反之亦然。

与 COM、CORBA 等其他技术相比,SOAP 有几个优点:例如,相对便宜的部署和调试成本、可扩展性和易用性,以及针对不同语言和平台的多种实现。

请参阅我们的简单教程SOAP来详细了解它。

本章使您熟悉 Ruby 的 SOAP 实现 (SOAP4R)。这是一个基础教程,因此如果您需要深入的详细信息,您需要参考其他资源。

安装 SOAP4R

SOAP4R 是由 Hiroshi Nakamura 开发的 Ruby 的 SOAP 实现,可以从以下地址下载:

注意- 您很可能已经安装了此组件。

Download SOAP

如果您了解gem实用程序,则可以使用以下命令来安装 SOAP4R 和相关包。

$ gem install soap4r --include-dependencies

如果您使用的是 Windows,则需要从上述位置下载压缩文件,并需要通过运行ruby​​ install.rb使用标准安装方法来安装它。

编写 SOAP4R 服务器

SOAP4R 支持两种不同类型的服务器 -

  • 基于 CGI/FastCGI (SOAP::RPC::CGIStub)
  • 独立(SOAP::RPC:StandaloneServer)

本章详细介绍了编写独立服务器。编写 SOAP 服务器涉及以下步骤。

步骤 1 - 继承 SOAP::RPC::StandaloneServer 类

要实现您自己的独立服务器,您需要编写一个新类,它将是SOAP::StandaloneServer的子类,如下所示 -

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

注意- 如果您想编写基于 FastCGI 的服务器,那么您需要将SOAP::RPC::CGIStub作为父类,其余过程将保持不变。

第 2 步 - 定义处理程序方法

第二步是编写您希望向外界公开的 Web 服务方法。

它们可以编写为简单的 Ruby 方法。例如,让我们编写两个方法来添加两个数字和除两个数字 -

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

   # Handler methods
   def add(a, b)
      return a + b
   end
   def div(a, b) 
      return a / b 
   end
end

第 3 步 - 公开处理程序方法

下一步是将我们定义的方法添加到我们的服务器。初始化方法用于通过以下两种方法之一公开服务方法-

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

这是参数的描述 -

先生。 参数及说明
1

接收者

包含 methodName 方法的对象。您可以将服务方法定义在与 methodDef 方法相同的类中,该参数是self

2

方法名

由于 RPC 请求而调用的方法的名称。

3

参数参数

当给定时,指定参数名称和参数模式。

要了解inoutout参数的用法,请考虑以下服务方法,该方法采用两个参数(inParam 和 inoutParam),返回一个正常返回值 (retVal) 和另外两个参数:inoutParamoutParam -

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)
])

第 4 步 - 启动服务器

最后一步是通过实例化派生类的一个实例并调用start方法来启动服务器。

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

myServer.start

这是所需参数的描述 -

先生。 参数及说明
1

服务器名称

服务器名称,您可以输入您最喜欢的名称。

2

瓮:ruby:服务名称

这里urn:ruby是常量,但您可以为此服务器指定唯一的 ServiceName 名称。

3

主机名

指定该服务器将侦听的主机名。

4

港口

用于 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

执行时,该服务器应用程序在本地主机上启动一个独立的 SOAP 服务器,并侦听端口8080上的请求。它公开一个服务方法adddiv,它接受两个参数并返回结果。

现在,您可以在后台运行该服务器,如下所示 -

$ ruby MyServer.rb&

编写 SOAP4R 客户端

SOAP ::RPC::Driver类提供对编写 SOAP 客户端应用程序的支持。本章描述该类并基于应用程序演示其用法。

以下是调用 SOAP 服务所需的最少信息 -

  • SOAP 服务的 URL(SOAP 端点 URL)。
  • 服务方法的命名空间(方法命名空间 URI)。
  • 服务方法的名称及其参数。

现在,我们将编写一个 SOAP 客户端,它将调用上面示例中定义的服务方法,名为adddiv

以下是创建 SOAP 客户端的主要步骤。

第 1 步 - 创建 SOAP 驱动程序实例

我们通过调用新方法来创建SOAP::RPC::Driver的实例,如下所示 -

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

这是所需参数的描述 -

先生。 参数及说明
1

端点

要连接的 SOAP 服务器的 URL。

2

名称空间

用于使用此 SOAP::RPC::Driver 对象完成的所有 RPC 的命名空间。

3

肥皂动作

HTTP 标头的 SOAPAction 字段的值。如果为零,则默认为空字符串“”。

第 2 步 - 添加服务方法

要将 SOAP 服务方法添加到SOAP::RPC::Driver,我们可以使用SOAP::RPC::Driver实例调用以下方法-

driver.add_method(name, *paramArg)

这是参数的描述 -

先生。 参数及说明
1

姓名

远程 Web 服务方法的名称。

2

参数参数

指定远程过程参数的名称。

第 3 步 - 调用 SOAP 服务

最后一步是使用SOAP::RPC::Driver实例为 SOAP 服务开具发票,如下所示 -

result = driver.serviceMethod(paramArg...)

这里serviceMethod是实际的Web服务方法,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 服务的非常基本的概念。如果您想进一步深入了解,可以通过以下链接查找有关Ruby Web 服务的更多详细信息。