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

Applicazione Web Service Ruby SOAP4R

Cos'è SOAP?

Il protocollo di accesso agli oggetti semplici (SOAP, abbreviazione di Simple Object Access Protocol) è una specifica di protocollo per lo scambio di dati.

SOAP è un protocollo semplice basato su XML, che permette alle applicazioni di scambiare informazioni tramite HTTP.

Il protocollo di accesso agli oggetti semplici è una specifica di protocollo per lo scambio di dati, è un protocollo leggero e semplice basato su XML (un sottoinsieme del linguaggio di markup generale standard), progettato per scambiare informazioni strutturate e fisse sul WEB.

Installazione di SOAP4R

SOAP4R è stato sviluppato e implementato da Hiroshi Nakamura, utilizzato per le applicazioni SOAP in Ruby.

Indirizzo di download SOAP4R:}http://raa.ruby-lang.org/project/soap4r/.

Attenzione:Il tuo ambiente Ruby potrebbe già avere questo componente installato.

Sotto ambiente Linux puoi anche utilizzare gem per installare questo componente, il comando è il seguente:

gem install soap4r --include-dependencies

Se stai sviluppando su ambiente Windows, devi scaricare il file zip compresso e installare eseguendo install.rb.

Servizio SOAP4R

SOAP4R supporta due tipi di servizi diversi:

  • Servizio basato su CGI/FastCGI (SOAP::RPC::CGIStub)

  • Servizio indipendente (SOAP::RPC:StandaloneServer)

Questo tutorial ti mostrerà come costruire un servizio SOAP indipendente. I passaggi sono i seguenti:

Passo 1 - Eredita SOAP::RPC::StandaloneServer

Per implementare il tuo server indipendente, devi scrivere una nuova classe, che è una sottoclasse di SOAP::RPC::StandaloneServer:

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

Attenzione:Se stai scrivendo un server basato su FastCGI, devi ereditare la classe SOAP::RPC::CGIStub, il resto del programma rimarrà invariato.

Passo 2 - Definisci il metodo di gestione

Quindi definiamo i metodi del Web Service, come definiamo due metodi, uno per sommare due numeri e uno per dividere due numeri:

class MyServer < SOAP::RPC::StandaloneServer
   ...............
 
   # Metodi di gestione
   def add(a, b)
      return a + b
   end
   def div(a, b) 
      return a / b 
   end
end

Passo 3 - Pubblica il metodo di gestione

Quindi aggiungiamo i metodi definiti sul server, il metodo initialize è pubblico e utilizzato per la connessione esterna:

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

Di seguito è riportata la descrizione di ciascun parametro:

ParametroDescrizione
receiverL'oggetto che contiene il nome del metodo. Se definisci un metodo di servizio nello stesso oggetto, questo parametro è self.
methodNameil nome del metodo della richiesta RPC.
paramArgnomi dei parametri e modelli dei parametri

Per comprendere inout e out 参数,考虑以下服务方法,需要输入两个参数: inParam 和 inoutParam,函数执行完成后返回三个值:retVal、inoutParam 、outParam:

def aMeth(inParam, inoutParam)
   retVal = inParam + inoutParam
   outParam = inParam . inoutParam
   inoutParam = inParam * inoutParam
   return retVal, inoutParam, outParam
end

I metodi di chiamata pubblici sono i seguenti:

add_method(self, 'aMeth', [
    %w(in inParam),
    %w(inout inoutParam),
    %w(out outParam),
    %w(retval return)
])

Quarto passo - Aprire il servizio

Infine, creiamo un'istanza della classe derivata e chiamiamo il metodo start per avviare il servizio:

myServer = MyServer.new('ServerName',
                        'urn:ruby:ServiceName', hostname, port)
 
myServer.start

Di seguito è riportata la descrizione dei parametri della richiesta:

ParametroDescrizione
ServerNamenome del servizio, puoi scegliere quello che preferisci
urn:ruby:ServiceNameEcco urn:ruby è fisso, ma puoi dare al tuo servizio un nome unico ServiceName
hostnameindicare il nome dell'host
portporta del servizio web

Esempio online

Prossimamente, seguendo i passaggi sopra, creiamo un servizio indipendente:

Esempio online

require "soap/rpc/standaloneserver"
 
begin
   class MyServer < SOAP::RPC::StandaloneServer
 
      # Expose our service
      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

Eseguito il programma sopra, è stato avviato un servizio locale che ascolta la porta 8080 e rende pubblici due metodi: add e div.

Puoi eseguire il servizio sopra descritto in background:

$ ruby MyServer.rb &

Client SOAP4R

Lo sviluppo del client SOAP in ruby utilizzando la classe SOAP::RPC::Driver. Passiamo ora a una visione dettagliata dell'uso della classe SOAP::RPC::Driver.

Per chiamare il servizio SOAP sono necessarie le seguenti informazioni:

  • Indirizzo URL del servizio SOAP (SOAP Endpoint URL)

  • Il namespace del metodo del servizio (URI del Method Namespace)

  • Il nome del metodo del servizio e le informazioni sui parametri

Procediamo a creare passo dopo passo il client SOAP per chiamare i metodi SOAP sopra descritti: add, div:

Passo 1 - Creare un esempio di SOAP Driver

Possiamo chiamare il nuovo metodo attraverso l'istanza della classe SOAP::RPC::Driver come segue:

SOAP::RPC::Driver.new(endPoint, nameSpace, soapAction)

Di seguito è riportata la descrizione dei parametri:

ParametroDescrizione
endPointL'indirizzo URL del servizio SOAP
nameSpaceIl namespace utilizzato per tutti gli RPC dell'oggetto SOAP::RPC::Driver.
soapActionIl valore del campo SOAPAction dell'intestazione HTTP. Se è una stringa vuota "", viene impostato di default a nil

Passo 2 - Aggiungere il metodo di servizio

Per aggiungere il metodo del servizio SOAP a SOAP::RPC::Driver, possiamo chiamare il seguente metodo tramite l'esempio SOAP::RPC::Driver:

driver.add_method(name, *paramArg)

Di seguito è riportata la descrizione dei parametri:

ParametroDescrizione
nameIl nome del metodo del servizio web remoto
paramArgSpecificare i parametri del programma remoto

Passo 3 - Chiamare il servizio SOAP

Infine, possiamo utilizzare l'esempio SOAP::RPC::Driver per chiamare il servizio SOAP:

result = driver.serviceMethod(*paramArg)

serviceMethod è il nome effettivo del metodo del servizio SOAP, paramArg è l'elenco dei parametri del metodo.

Esempio online

Sulla base dei passaggi sopra descritti, possiamo scrivere il seguente client SOAP:

Esempio 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)
   
   # 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

Abbiamo solo introdotto in modo semplice il Web Service di Ruby. Se desideri saperne di più, consulta la documentazione ufficiale:Web Service di Ruby