Ruby 简明教程
Web Services with Ruby - SOAP4R
What is SOAP?
简单对象访问协议(SOAP)是一个基于 XML,通常(但并非必须)基于 HTTP 的跨平台、与语言无关的 RPC 协议。
它使用 XML 对进行远程过程调用的信息进行编码,并使用 HTTP 通过网络将该信息从客户端传输到服务器,反之亦然。
与 COM、CORBA 等其他技术相比,SOAP 具有若干优势:例如,它的部署和调试成本相对较低、具有可扩展性和易用性,并且为不同的语言和平台存在多种实现。
请参阅我们的简单教程 SOAP 以详细了解它。
本小节让你熟悉 Ruby 的 SOAP 实现(SOAP4R)。这是一本基础教程,因此如果你需要更深入了解,你需要参考其他资源。
Installing SOAP4R
SOAP4R 是由 Hiroshi Nakamura 开发的 Ruby 的 SOAP 实现,可从以下位置下载:
NOTE − 已经安装此组件的可能性很大。
Download SOAP
如果您知道 gem 实用的功能,可以使用以下命令安装SOAP4R及其相关包。
$ gem install soap4r --include-dependencies
如果您在Windows上工作,则需要从上述位置下载一个zip文件,并且需要使用标准安装方法通过运行ruby install.rb来安装它。
Writing SOAP4R Servers
SOAP4R支持两种不同类型的服务器−
-
CGI/FastCGI based (SOAP::RPC::CGIStub)
-
Standalone (SOAP::RPC:StandaloneServer)
本章提供了有关编写独立服务器的详细信息。在编写SOAP服务器中涉及以下步骤。
Step 1 - Inherit SOAP::RPC::StandaloneServer Class
要实施您自己的独立服务器,您需要编写一个新类,该类将成为SOAP::StandaloneServer的子类,如下所示:−
class MyServer < SOAP::RPC::StandaloneServer
...............
end
NOTE -如果您想编写基于FastCGI的服务器,则需要将SOAP::RPC::CGIStub作为父类,其余过程将保持不变。
Step 2 - Define Handler Methods
第二步是编写您希望向外界公开的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
Step 3 - Expose Handler Methods
下一步是将我们定义的方法添加到服务器中。初始化方法用于使用以下两种方法之一公开服务方法:−
class MyServer < SOAP::RPC::StandaloneServer
def initialize(*args)
add_method(receiver, methodName, *paramArg)
end
end
以下是参数说明 −
Sr.No. |
Parameter & Description |
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)
])
Step 4 - Start the Server
最后一步是通过实例化一个派生类的实例并调用 start 方法来启动服务器。
myServer = MyServer.new('ServerName', 'urn:ruby:ServiceName', hostname, port)
myServer.start
以下是所需参数的说明:−
Sr.No. |
Parameter & Description |
1 |
ServerName 服务器名称,您可以自由定制。 |
2 |
urn:ruby:ServiceName 此处urn:ruby是常量,但您可以为此服务器提供唯一的ServiceName名称。 |
3 |
hostname 指定此服务器要监听的主机名。 |
4 |
port 用于 Web 服务的可用端口号。 |
Example
现在,使用上述步骤,让我们编写一个独立服务器 −
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 上的请求。它公开了一种服务方法,即加法和除法,该方法接受两个参数并返回结果。
现在,您可以按如下方式在后台运行此服务器 −
$ ruby MyServer.rb&
Writing SOAP4R Clients
SOAP::RPC::Driver 类提供对编写 SOAP 客户端应用程序的支持。本章介绍此类,并根据一个应用程序演示其使用。
以下是调用 SOAP 服务所需的最基本信息 −
-
SOAP 服务的 URL(SOAP 端点 URL)。
-
服务方法的命名空间(方法命名空间 URI)。
-
服务方法及其参数的名称。
现在,我们将编写一个 SOAP 客户端,它将调用在上一个示例中定义的服务方法,即加法和除法。
以下是创建 SOAP 客户端的主要步骤。
Step 1 - Create a SOAP Driver Instance
我们通过调用 new 方法按照如下方式创建 SOAP::RPC::Driver 的一个实例 −
SOAP::RPC::Driver.new(endPoint, nameSpace, soapAction)
以下是所需参数的说明:−
Sr.No. |
Parameter & Description |
1 |
endPoint 要连接的 SOAP 服务器的 URL。 |
2 |
nameSpace 用于此 SOAP::RPC::Driver 对象完成的所有 RPC 的命名空间。 |
3 |
soapAction HTTP 标头的 SOAPAction 字段的一个值。如果为 nil,此值将默认为空字符串 ""。 |
Step 2 - Add Service Methods
若要向 SOAP::RPC::Driver 添加 SOAP 服务方法,我们可以使用 SOAP::RPC::Driver 实例调用如下方法 −
driver.add_method(name, *paramArg)
以下是参数说明 −
Sr.No. |
Parameter & Description |
1 |
name 远程 Web 服务方法的名称。 |
2 |
paramArg 指定远程过程的参数名称。 |
Step 3 - Invoke SOAP service
最后一步是使用 SOAP::RPC::Driver 实例调用 SOAP 服务,如下所示 −
result = driver.serviceMethod(paramArg...)
在其中,serviceMethod 为实际的 Web 服务方法,paramArg… 是需在服务方法中传递的参数列表。
Example
根据上述步骤,我们编写 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
Further Readings
我刚刚解释了 Web 服务与 Ruby 的基本概念。如果您希望进一步深入了解,可以访问以下链接,以查找更多有关 Web Services with Ruby 的详细信息。