📅  最后修改于: 2020-10-16 06:04:05             🧑  作者: Mango
简单对象访问协议(SOAP)是基于XML和(通常(但不一定))HTTP的跨平台且独立于语言的RPC协议。
它使用XML对进行远程过程调用的信息进行编码,并使用HTTP在整个网络上从客户机到服务器传输该信息,反之亦然。
与其他技术(例如COM,CORBA等)相比,SOAP具有一些优势:例如,相对便宜的部署和调试成本,可扩展性和易用性以及针对不同语言和平台的几种实现的存在。
请参考我们的简单教程SOAP来详细了解它。
本章使您熟悉Ruby的SOAP实现(SOAP4R)。这是一个基础教程,因此,如果您需要更详细的信息,则需要参考其他资源。
SOAP4R是Hiroshi Nakamura开发的Ruby的SOAP实现,可以从以下位置下载-
注意–您很有可能已经安装了此组件。
Download SOAP
如果您知道gem实用程序,则可以使用以下命令来安装SOAP4R和相关软件包。
$ gem install soap4r --include-dependencies
如果您使用的是Windows,则需要从上述位置下载压缩文件,并需要通过运行ruby install.rb使用标准安装方法进行安装。
SOAP4R支持两种不同类型的服务器-
本章详细介绍了编写独立服务器的过程。编写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. | 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. |
要了解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. | 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上侦听请求。它公开一个服务方法add和div ,该方法带有两个参数并返回结果。
现在,您可以在后台运行此服务器,如下所示:
$ ruby MyServer.rb&
SOAP :: RPC :: Driver类提供了对编写SOAP客户端应用程序的支持。本章将介绍此类,并根据应用程序演示其用法。
以下是调用SOAP服务所需的最基本的信息-
现在,我们将编写一个SOAP客户端,该客户端将调用上面示例中定义的服务方法add和div 。
这是创建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 “”. |
要将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. |
最后一步是使用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服务的更多详细信息。