English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Aplicação de Web Service SOAP em Ruby4R

O que é SOAP?

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 安装

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 服务

SOAP4R 支持两种不同的服务类型:

  • 基于 CGI/FastCGI 服务 (SOAP::RPC::CGIStub)

  • 独立服务 (SOAP::RPC:StandaloneServer)

本教程将为大家介绍如何建立独立的 SOAP 服务。步骤如下:

第1步 - 继承SOAP::RPC::StandaloneServer

为了实现自己的独立的服务器,你需要编写一个新的类,该类为 SOAP::RPC::StandaloneServer 的子类:

class MyServer < SOAP::RPC::StandaloneServer
  .............
fim

注意:如果你要编写一个基于FastCGI的服务器,那么你需要继承 SOAP::RPC::CGIStub 类,程序的其余部分将保持不变。

Passo 2 - 定义处理方法

接下来我们定义Web Service的方法,如下我们定义两个方法,一个是两个数相加,一个是两个数相除:

class MyServer < SOAP::RPC::StandaloneServer
   .............
 
   # 处理方法
   def add(a, b)
      return a + b
   fim
   def div(a, b) 
      return a / b 
   fim
fim

Passo 3 - 公布处理方法

接下来添加我们在服务器上定义的方法,initialize方法是公开的,用于外部的连接:

class MyServer < SOAP::RPC::StandaloneServer
   def initialize(*args)
      add_method(receiver, inoutParam, *paramArg)
   fim
fim

以下是各参数的说明:

ParâmetrosDescrição
receiver包含方法名的方法的对象。 如果你在同一个类中定义服务方法,该参数为 self
methodName调用 RPC 请求的方法名。
paramArg参数名和参数模式

为了理解 inoutout 参数,考虑以下服务方法,需要输入两个参数: 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)
])

Quarto passo - Iniciar serviço

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âmetrosDescrição
ServerNamenome do serviço, você pode escolher o que quiser
urn:ruby:ServiceNameAqui urn:ruby é fixo, mas você pode dar um nome único ao seu serviço ServiceName
hostnameespecificar o nome do host
portporta do serviço web

Exemplo Online

A seguir, vamos criar um serviço independente seguindo os seguintes passos:

Exemplo Online

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 &

SOAP4Cliente R

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:

Passo 1 - Criar exemplo SOAP Driver

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âmetrosDescrição
endPointEndereço URL do serviço SOAP
nameSpaceNamespace usado para todos os RPC do objeto SOAP::RPC::Driver.
soapActionValor do campo SOAPAction para cabeçalhos HTTP. Se for uma string vazia "", o valor padrão é nil

Passo 2 - Adicionar método de serviço

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âmetrosDescrição
NomeNome do método do serviço web remoto
paramArgEspecificar os parâmetros do programa remoto

Passo 3 - Chamar serviço SOAP

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.

Exemplo Online

Com base nos passos acima, podemos escrever o seguinte cliente SOAP:

Exemplo Online

#!/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