简单对象访问协议(SOAP)是一种基于XML的跨平台且与语言无关的RPC协议,通常(但不一定是)HTTP .
它使用XML来编码进行远程过程调用的信息,并使用HTTP将这些信息通过网络从客户端传输到服务器,反之亦然.
SOAP比COM,CORBA等其他技术有几个优点:例如,它相对便宜的部署和调试成本,可扩展性和易用性,以及针对不同语言和平台的多个实现的存在./p>
请参阅我们的简单教程 SOAP 以详细了解它.
本章让您熟悉Ruby的SOAP实现(SOAP4R).这是一个基础教程,因此如果您需要深入细节,则需要引用其他资源.
SOAP4R是SOAP由Hiroshi Nakamura开发的Ruby实现,可以从&minus下载;
注意 : 您可能已经安装了此组件.
下载SOAP
如果你知道 gem 实用程序那么你可以使用以下命令安装SOAP4R及相关软件包.
$ gem install soap4r --include-dependencies
如果你在Windows上工作,那么你需要从上面的位置下载一个压缩文件,需要通过运行 ruby install.rb </>使用标准安装方法来安装它. i>.
SOAP4R支持两种不同类型的服务器 :
基于CGI/FastCGI(SOAP :: RPC :: CGIStub)
独立(SOAP :: RPC:StandaloneServer)
本章详细介绍了如何编写独立服务器.编写SOAP服务器涉及以下步骤.
实现自己的支架单独的服务器你需要编写一个新类,它将是 SOAP :: StandaloneServer 的子代,如下所示 :
class MyServer < SOAP::RPC::StandaloneServer ............... end
注意 : 如果你想编写一个基于FastCGI的服务器,那么你需要把 SOAP :: RPC :: CGIStub 作为父类,其余的程序将保持不变.
第二步是编写您希望向外界公开的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
下一步是将我们定义的方法添加到服务器. 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 + 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) ])
最后一步是通过实例化派生类的一个实例并调用 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 + 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&
SOAP :: RPC :: Driver 类提供支持用于编写SOAP客户端应用程序本章描述了这个类,并在应用程序的基础上演示了它的用法.
以下是调用SOAP服务所需的最低限度信息 :
SOAP服务的URL(SOAP端点URL).
服务方法的命名空间(方法名称空间URI) .
服务方法及其参数的名称.
现在,我们将编写一个SOAP客户端,将调用上面示例中定义的服务方法,名为 add 和 div .
以下是创建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,则默认为空字符串"". |
要将SOAP服务方法添加到 SOAP :: RPC :: Driver ,我们可以使用 SOAP :: RPC :: Driver instance :
driver.add_method(name, *paramArg)
以下是参数的说明 :
Sr.No. | 参数&说明 |
---|---|
1 | name 远程Web服务方法的名称. |
2 | paramArg 指定遥控器的名称程序的参数. |
最后一步是使用 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服务.