📜  Ruby的Web服务-SOAP4R

📅  最后修改于: 2020-10-16 06:04:05             🧑  作者: Mango


什么是SOAP?

简单对象访问协议(SOAP)是基于XML和(通常(但不一定))HTTP的跨平台且独立于语言的RPC协议。

它使用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步-公开处理程序方法

下一步是将定义的方法添加到服务器。 initialize方法用于通过以下两种方法之一公开服务方法:

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

这是参数的描述-

Sr.No. Parameter & Description
1

receiver

The object that contains the methodName method. You define the service methods in the same class as the methodDef method, this parameter is self.

2

methodName

The name of the method that is called due to an RPC request.

3

paramArg

Specifies, when given, the parameter names and parameter modes.

要了解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

这是必需参数的描述-

Sr.No. Parameter & Description
1

ServerName

A server name, you can give what you like most.

2

urn:ruby:ServiceName

Here urn:ruby is constant but you can give a unique ServiceName name for this server.

3

hostname

Specifies the hostname on which this server will listen.

4

port

An available port number to be used for the web service.

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

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上侦听请求。它公开一个服务方法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)

这是必需参数的描述-

Sr.No. Parameter & Description
1

endPoint

URL of the SOAP server to connect with.

2

nameSpace

The namespace to use for all RPCs done with this SOAP::RPC::Driver object.

3

soapAction

A value for the SOAPAction field of the HTTP header. If nil this defaults to the empty string “”.

第2步-添加服务方法

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

driver.add_method(name, *paramArg)

这是参数的描述-

Sr.No. Parameter & Description
1

name

The name of the remote web service method.

2

paramArg

Specifies the names of the remote procedures’ parameters.

步骤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服务的更多详细信息。