English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
O Protocolo de Acesso a Objetos Simples (SOAP, abreviado para Simple Object Access Protocol) é uma especificação de protocolo para troca de dados.
SOAP é um protocolo simples baseado em XML, que permite que aplicações troquem informações através de HTTP.
O Protocolo de Acesso a Objetos Simples (SOAP) é uma especificação de protocolo para troca de dados, é um protocolo leve, simples e baseado em XML (um subconjunto do Linguagem de Marcação de Caracteres Genérica - XML), projetado para troca de informações estruturadas e fixas na WEB.
SOAP4R 由Hiroshi Nakamura开发实现,用于 Ruby 的 SOAP 应用。
SOAP4R 下载地址:http://raa.ruby-lang.org/project/soap4r/。
注意:你的ruby环境可能已经安装了该组件。
Linux 环境下你也可以使用 gem 来安装该组件,命令如下:
gem install soap4r --include-dependencies
如果你是window环境下开发,你需要下载zip压缩文件,并通过执行 install.rb 来安装。
SOAP4R 支持两种不同的服务类型:
基于 CGI/FastCGI 服务 (SOAP::RPC::CGIStub)
独立服务 (SOAP::RPC:StandaloneServer)
本教程将为大家介绍如何建立独立的 SOAP 服务。步骤如下:
为了实现自己的独立的服务器,你需要编写一个新的类,该类为 SOAP::RPC::StandaloneServer 的子类:
class MyServer < SOAP::RPC::StandaloneServer ............. fim
注意:如果你要编写一个基于FastCGI的服务器,那么你需要继承 SOAP::RPC::CGIStub 类,程序的其余部分将保持不变。
接下来我们定义Web Service的方法,如下我们定义两个方法,一个是两个数相加,一个是两个数相除:
class MyServer < SOAP::RPC::StandaloneServer ............. # 处理方法 def add(a, b) return a + b fim def div(a, b) return a / b fim fim
接下来添加我们在服务器上定义的方法,initialize方法是公开的,用于外部的连接:
class MyServer < SOAP::RPC::StandaloneServer def initialize(*args) add_method(receiver, inoutParam, *paramArg) fim fim
以下是各参数的说明:
Parâmetros | Descrição |
---|---|
receiver | 包含方法名的方法的对象。 如果你在同一个类中定义服务方法,该参数为 self。 |
methodName | 调用 RPC 请求的方法名。 |
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 fim
Os métodos de chamada públicos são os seguintes:
add_method(self, 'aMeth', [ %w(in inParam), %w(inout inoutParam), %w(out outParam), %w(retval return) ])
Por fim, vamos exemplificar a classe derivada e chamar o método start para iniciar o serviço:
myServer = MyServer.new('ServerName', 'urn:ruby:ServiceName', hostname, port) myServer.start
A seguir, estão as instruções sobre os parâmetros da solicitação:
Parâmetros | Descrição |
---|---|
ServerName | nome do serviço, você pode escolher o que quiser |
urn:ruby:ServiceName | Aqui urn:ruby é fixo, mas você pode dar um nome único ao seu serviço ServiceName |
hostname | especificar o nome do host |
port | porta do serviço web |
A seguir, vamos criar um serviço independente seguindo os seguintes passos:
require "soap/rpc/standaloneserver" begin class MyServer < SOAP::RPC::StandaloneServer # Exponha nosso serviço def initialize(*args) add_method(self, 'add', 'a', 'b') add_method(self, 'div', 'a', 'b') fim # Métodos de manipulação def add(a, b) return a + b fim def div(a, b) return a / b fim fim server = MyServer.new("MyServer", 'urn:ruby:calculation', 'localhost', 8080) trap('INT') { server.shutdown } server.start rescue => err puts err.message fim
Após a execução do programa acima, foi iniciado um listener 808O serviço local na porta 0, que expõe dois métodos: add e div.
Você pode executar este serviço em segundo plano:
$ ruby MyServer.rb &
Desenvolvendo clientes SOAP em Ruby usando a classe SOAP::RPC::Driver. Vamos ver a utilização detalhada da classe SOAP::RPC::Driver.
Para chamar o serviço SOAP, são necessários os seguintes informações:
Endereço URL do serviço SOAP (SOAP Endpoint URL)
Namespace do método de serviço (URI do Namespace do Método)
Nome do método de serviço e informações de parâmetros
A seguir, vamos passo a passo criar o cliente SOAP para chamar os métodos SOAP acima: add, div:
Podemos criar uma instância da classe SOAP::RPC::Driver para chamá-la, conforme exemplo a seguir:
SOAP::RPC::Driver.new(endPoint, nameSpace, soapAction)
A seguir, está a descrição dos parâmetros:
Parâmetros | Descrição |
---|---|
endPoint | Endereço URL do serviço SOAP |
nameSpace | Namespace usado para todos os RPC do objeto SOAP::RPC::Driver. |
soapAction | Valor do campo SOAPAction para cabeçalhos HTTP. Se for uma string vazia "", o valor padrão é nil |
Para adicionar métodos de serviço SOAP ao SOAP::RPC::Driver, podemos chamar o exemplo SOAP::RPC::Driver para chamar os seguintes métodos:
driver.add_method(name, *paramArg)
A seguir, está a descrição dos parâmetros:
Parâmetros | Descrição |
---|---|
Nome | Nome do método do serviço web remoto |
paramArg | Especificar os parâmetros do programa remoto |
Por fim, podemos usar o exemplo SOAP::RPC::Driver para chamar o serviço SOAP:
result = driver.serviceMethod(paramArg...)
serviceMethod é o nome real do método do serviço SOAP, paramArg é a lista de argumentos do método.
Com base nos passos acima, podemos escrever o seguinte cliente 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) # Adicionar métodos de serviço remoto driver.add_method('add', 'a', 'b') # Chamar métodos de serviço remoto puts driver.add(20, 30) rescue => err puts err.message fim
Aqui, apenas introduzimos brevemente o Web Service do Ruby. Se você quiser saber mais, consulte a documentação oficial:Web Service do Ruby