使用Ruby的Web服务 - SOAP4R

什么是SOAP?

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

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

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

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

本章让您熟悉Ruby的SOAP实现(SOAP4R).这是一个基础教程,因此如果您需要深入细节,则需要引用其他资源.

安装SOAP4R

SOAP4R是SOAP由Hiroshi Nakamura开发的Ruby实现,可以从&minus下载;

注意 : 您可能已经安装了此组件.

 下载SOAP

如果你知道 gem 实用程序那么你可以使用以下命令安装SOAP4R及相关软件包.

$ gem install soap4r --include-dependencies

如果你在Windows上工作,那么你需要从上面的位置下载一个压缩文件,需要通过运行 ruby install.rb </>使用标准安装方法来安装它. i>.

编写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 &plus; b
   end
   def div(a, b) 
      return a / b 
   end
end

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

下一步是将我们定义的方法添加到服务器. initialize 方法用于使用以下两种方法之一公开服务方法 :

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

以下是参数的说明 :

Sr.No.参数&说明
1

receiver

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

2

methodName

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

3

paramArg

在给定时指定参数名称和参数模式.

要了解 inout out 参数的用法,请考虑以下服务方法它接受两个参数(inParam和inoutParam),返回一个正常返回值(retVal)和另外两个参数: inoutParam outParam :

def aMeth(inParam, inoutParam)
   retVal = inParam &plus; 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

以下是所需参数的说明 :

Sr.No.参数&说明
1

ServerName

服务器名称,你可以给你最喜欢的.

2

urn:ruby:ServiceName

这里 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 &plus; 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服务器并侦听 port 8080上的请求.它公开了一个服务方法, add div ,它接受两个参数并返回结果.

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

$ ruby MyServer.rb&

编写SOAP4R客户端

SOAP :: RPC :: Driver 类提供支持用于编写SOAP客户端应用程序本章描述了这个类,并在应用程序的基础上演示了它的用法.

以下是调用SOAP服务所需的最低限度信息 :

  • SOAP服务的URL(SOAP端点URL).

  • 服务方法的命名空间(方法名称空间URI) .

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

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

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

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

我们创建 SOAP :: RPC :: Driver 的实例调用它的新方法如下 :

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

以下是所需参数的说明 :

Sr.No.参数&说明
1

endPoint

要连接的SOAP服务器的URL.

2

nameSpace

用于所有人的名称空间用这个SOAP :: RPC :: Driver对象完成的RPC.

3

soapAction

HTTP标头的SOAPAction字段的值.如果为n,则默认为空字符串"".

步骤2  - 添加服务方法

要将SOAP服务方法添加到 SOAP :: RPC :: Driver ,我们可以使用 SOAP :: RPC :: Driver  instance :

driver.add_method(name, *paramArg)

以下是参数的说明 :

Sr.No.参数&说明
1

name

远程Web服务方法的名称.

2

paramArg

指定遥控器的名称程序的参数.

步骤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服务.