Ruby WebService SOAP4R

  • 什么是SOAP?

    简单对象访问协议(SOAP)是基于XML和(通常(但不一定))HTTP的跨平台且独立于语言的RPC协议。它使用XML对进行远程过程调用的信息进行编码,并使用HTTP在整个网络上从客户机到服务器传输该信息,反之亦然。与其他技术(例如COM,CORBA等)相比,SOAP具有一些优势:例如,相对便宜的部署和调试成本,可扩展性和易用性以及针对不同语言和平台的几种实现的存在。本章使您熟悉Ruby的SOAP实现(SOAP4R)。这是一个基础教程,因此,如果您需要更详细的信息,则需要参考其他资源。
  • 安装SOAP4R

    用gem 安装
    
    > gem install httpclient
    > gem install soap4r
    
  • 编写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
    
    这是参数的描述-
    参数 说明
    receiver 包含methodName方法的对象。 您可以在与methodDef方法相同的类中定义服务方法,此参数为self。
    methodName 由于RPC请求而调用的方法的名称。
    paramArg 指定给定的参数名称和模式。
    要了解的使用INOUT或出参数,可以考虑采用两个参数(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)
    ])
    
    步骤4-启动服务器
    最后一步是通过实例化派生类的一个实例并调用start方法来启动服务器。
    
    myServer = MyServer.new('ServerName', 'urn:ruby:ServiceName', hostname, port)
    
    myServer.start
    
    这是必需参数的描述-
    参数 说明
    ServerName 服务器名称,您可以提供最喜欢的服务器名称。
    urn:ruby:ServiceName urn:ruby在这里是常数,但是您可以为此服务器指定唯一的ServiceName名称。
    hostname 指定此服务器将在其上侦听的主机名。
    port 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
    
    执行后,此服务器应用程序将在localhost上启动独立的SOAP服务器,并在端口 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)
    
    这是必需参数的描述-
    参数 说明
    endPoint 要连接的SOAP服务器的URL。
    nameSpace 使用此SOAP::RPC::Driver对象完成的所有RPC使用的名称空间。
    soapAction HTTP标头的SOAPAction字段的值。 如果为nil,则默认为空字符串“”。
    第2步-添加服务方法
    要将SOAP服务方法添加到SOAP::RPC::Driver中,我们可以使用SOAP::RPC::Driver实例调用以下方法-
    
    driver.add_method(name, *paramArg)
    
    这是参数的描述-
    参数 说明
    name 远程Web服务方法的名称。
    paramArg 指定远程过程参数的名称。
    步骤3-调用SOAP服务
    最后一步是使用SOAP::RPC::Driver实例为SOAP服务开具发票,如下所示:
    
    result = driver.serviceMethod(paramArg...)
    
    这里serviceMethod是实际的Web服务方法,paramArg ...是传递该服务方法所需的列表参数。
    基于以上步骤,我们将编写一个SOAP客户端,如下所示:
    
    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