Ruby 简明教程

Web Services with Ruby - SOAP4R

What is SOAP?

简单对象访问协议(SOAP)是一个基于 XML,通常(但并非必须)基于 HTTP 的跨平台、与语言无关的 RPC 协议。

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

与 COM、CORBA 等其他技术相比,SOAP 具有若干优势:例如,它的部署和调试成本相对较低、具有可扩展性和易用性,并且为不同的语言和平台存在多种实现。

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

本小节让你熟悉 Ruby 的 SOAP 实现(SOAP4R)。这是一本基础教程,因此如果你需要更深入了解,你需要参考其他资源。

Installing SOAP4R

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

NOTE − 已经安装此组件的可能性很大。

Download SOAP

如果您知道 gem 实用的功能,可以使用以下命令安装SOAP4R及其相关包。

$ gem install soap4r --include-dependencies

如果您在Windows上工作,则需要从上述位置下载一个zip文件,并且需要使用标准安装方法通过运行ruby install.rb来安装它。

Writing SOAP4R Servers

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

  1. CGI/FastCGI based (SOAP::RPC::CGIStub)

  2. Standalone (SOAP::RPC:StandaloneServer)

本章提供了有关编写独立服务器的详细信息。在编写SOAP服务器中涉及以下步骤。

Step 1 - Inherit SOAP::RPC::StandaloneServer Class

要实施您自己的独立服务器,您需要编写一个新类,该类将成为SOAP::StandaloneServer的子类,如下所示:−

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

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

Step 2 - Define Handler Methods

第二步是编写您希望向外界公开的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

Step 3 - Expose Handler Methods

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

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

以下是参数说明 −

Sr.No.

Parameter & Description

1

receiver 包含methodName方法的对象。您在与methodDef方法相同的类中定义服务方法,此参数为self。

2

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

3

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

Step 4 - Start the Server

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

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

myServer.start

以下是所需参数的说明:−

Sr.No.

Parameter & Description

1

ServerName 服务器名称,您可以自由定制。

2

urn:ruby:ServiceName 此处urn:ruby是常量,但您可以为此服务器提供唯一的ServiceName名称。

3

hostname 指定此服务器要监听的主机名。

4

port 用于 Web 服务的可用端口号。

Example

现在,使用上述步骤,让我们编写一个独立服务器 −

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

在执行时,此服务器应用程序在 localhost 上启动一个独立 SOAP 服务器,并侦听端口 8080 上的请求。它公开了一种服务方法,即加法和除法,该方法接受两个参数并返回结果。

现在,您可以按如下方式在后台运行此服务器 −

$ ruby MyServer.rb&

Writing SOAP4R Clients

SOAP::RPC::Driver 类提供对编写 SOAP 客户端应用程序的支持。本章介绍此类,并根据一个应用程序演示其使用。

以下是调用 SOAP 服务所需的最基本信息 −

  1. SOAP 服务的 URL(SOAP 端点 URL)。

  2. 服务方法的命名空间(方法命名空间 URI)。

  3. 服务方法及其参数的名称。

现在,我们将编写一个 SOAP 客户端,它将调用在上一个示例中定义的服务方法,即加法和除法。

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

Step 1 - Create a SOAP Driver Instance

我们通过调用 new 方法按照如下方式创建 SOAP::RPC::Driver 的一个实例 −

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

以下是所需参数的说明:−

Sr.No.

Parameter & Description

1

endPoint 要连接的 SOAP 服务器的 URL。

2

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

3

soapAction HTTP 标头的 SOAPAction 字段的一个值。如果为 nil,此值将默认为空字符串 ""。

Step 2 - Add Service Methods

若要向 SOAP::RPC::Driver 添加 SOAP 服务方法,我们可以使用 SOAP::RPC::Driver 实例调用如下方法 −

driver.add_method(name, *paramArg)

以下是参数说明 −

Sr.No.

Parameter & Description

1

name 远程 Web 服务方法的名称。

2

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

Step 3 - Invoke SOAP service

最后一步是使用 SOAP::RPC::Driver 实例调用 SOAP 服务,如下所示 −

result = driver.serviceMethod(paramArg...)

在其中,serviceMethod 为实际的 Web 服务方法,paramArg…​​ 是需在服务方法中传递的参数列表。

Example

根据上述步骤,我们编写 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

Further Readings

我刚刚解释了 Web 服务与 Ruby 的基本概念。如果您希望进一步深入了解,可以访问以下链接,以查找更多有关 Web Services with Ruby 的详细信息。