- Ruby 基础
- Ruby - 首页
- Ruby - 概述
- Ruby - 环境搭建
- Ruby - 语法
- Ruby - 类和对象
- Ruby - 变量
- Ruby - 运算符
- Ruby - 注释
- Ruby - IF...ELSE
- Ruby - 循环
- Ruby - 方法
- Ruby - 代码块
- Ruby - 模块
- Ruby - 字符串
- Ruby - 数组
- Ruby - 哈希表
- Ruby - 日期和时间
- Ruby - 范围
- Ruby - 迭代器
- Ruby - 文件 I/O
- Ruby - 异常
Ruby Web 服务 - SOAP4R
什么是 SOAP?
简单对象访问协议 (SOAP) 是一种跨平台且与语言无关的基于 XML 的 RPC 协议,通常(但并非总是)基于 HTTP。
它使用 XML 编码进行远程过程调用的信息,并使用 HTTP 通过网络在客户端和服务器之间传输这些信息。
与其他技术(如 COM、CORBA 等)相比,SOAP 具有若干优势:例如,其相对较低的部署和调试成本、其可扩展性和易用性,以及针对不同语言和平台的多种实现。
请参考我们简单的教程 SOAP 以详细了解它。
本章使您熟悉 Ruby 的 SOAP 实现 (SOAP4R)。这是一个基本的教程,因此,如果您需要深入了解,则需要参考其他资源。
安装 SOAP4R
SOAP4R 是由 Nakamura Hiroshi 开发的 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
以下是参数的说明 -
序号 | 参数及描述 |
---|---|
1 | 接收者 包含 methodName 方法的对象。您在与 methodDef 方法相同的类中定义服务方法,此参数为self。 |
2 | 方法名称 由于 RPC 请求而调用的方法的名称。 |
3 | 参数 指定(如果给出)参数名称和参数模式。 |
要了解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) ])
步骤 4 - 启动服务器
最后一步是通过实例化派生类的一个实例并调用start方法来启动服务器。
myServer = MyServer.new('ServerName', 'urn:ruby:ServiceName', hostname, port) myServer.start
以下是所需参数的说明 -
序号 | 参数及描述 |
---|---|
1 | 服务器名称 服务器名称,您可以随意命名。 |
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 服务器,并在端口8080 上监听请求。它公开了两个服务方法,add和div,它们接受两个参数并返回结果。
现在,您可以如下所示在后台运行此服务器 -
$ ruby MyServer.rb&
编写 SOAP4R 客户端
SOAP::RPC::Driver类提供对编写 SOAP 客户端应用程序的支持。本章介绍了此类,并根据应用程序演示了其用法。
以下是调用 SOAP 服务所需的最低限度信息 -
- SOAP 服务的 URL(SOAP 端点 URL)。
- 服务方法的命名空间(方法命名空间 URI)。
- 服务方法的名称及其参数。
现在,我们将编写一个 SOAP 客户端,它将调用上面示例中定义的服务方法,名为add和div。
以下是创建 SOAP 客户端的主要步骤。
步骤 1 - 创建 SOAP 驱动程序实例
我们通过调用其 new 方法创建SOAP::RPC::Driver的实例,如下所示 -
SOAP::RPC::Driver.new(endPoint, nameSpace, soapAction)
以下是所需参数的说明 -
序号 | 参数及描述 |
---|---|
1 | 端点 要连接的 SOAP 服务器的 URL。 |
2 | 命名空间 为此 SOAP::RPC::Driver 对象完成的所有 RPC 使用的命名空间。 |
3 | soapAction HTTP 标头的 SOAPAction 字段的值。如果为 nil,则默认为空字符串 ""。 |
步骤 2 - 添加服务方法
要将 SOAP 服务方法添加到SOAP::RPC::Driver,我们可以使用SOAP::RPC::Driver实例调用以下方法 -
driver.add_method(name, *paramArg)
以下是参数的说明 -
序号 | 参数及描述 |
---|---|
1 | 名称 远程 Web 服务方法的名称。 |
2 | 参数 指定远程过程的参数名称。 |
步骤 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 = 'https://127.0.0.1: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 服务的更多详细信息。