Servizi Web con Ruby - SOAP4R

Cos'è SOAP?

Il Simple Object Access Protocol (SOAP), è un protocollo RPC multipiattaforma e indipendente dal linguaggio basato su XML e, solitamente (ma non necessariamente) HTTP.

Utilizza XML per codificare le informazioni che effettuano la chiamata di procedura remota e HTTP per trasportare tali informazioni attraverso una rete dai client ai server e viceversa.

SOAP presenta diversi vantaggi rispetto ad altre tecnologie come COM, CORBA ecc: ad esempio, i suoi costi di distribuzione e debug relativamente economici, la sua estensibilità e facilità d'uso e l'esistenza di numerose implementazioni per diversi linguaggi e piattaforme.

Si prega di fare riferimento al nostro semplice tutorial SOAP per capirlo in dettaglio.

Questo capitolo ti rende familiare con l'implementazione SOAP per Ruby (SOAP4R). Questo è un tutorial di base, quindi se hai bisogno di un dettaglio approfondito, dovresti fare riferimento ad altre risorse.

Installazione di SOAP4R

SOAP4R è l'implementazione SOAP per Ruby sviluppata da Hiroshi Nakamura e può essere scaricata da -

NOTE - Potrebbe esserci una grande possibilità che tu abbia già installato questo componente.

Download SOAP

Se sei a conoscenza di gem quindi è possibile utilizzare il seguente comando per installare SOAP4R e relativi pacchetti.

$ gem install soap4r --include-dependencies

Se stai lavorando su Windows, devi scaricare un file zippato dalla posizione sopra e devi installarlo utilizzando il metodo di installazione standard eseguendo ruby install.rb .

Scrittura di server SOAP4R

SOAP4R supporta due diversi tipi di server:

  • Basato su CGI / FastCGI (SOAP :: RPC :: CGIStub)
  • Standalone (SOAP :: RPC: StandaloneServer)

Questo capitolo fornisce dettagli sulla scrittura di un server autonomo. I seguenti passaggi sono coinvolti nella scrittura di un server SOAP.

Passaggio 1: ereditare la classe SOAP :: RPC :: StandaloneServer

Per implementare il tuo server autonomo devi scrivere una nuova classe, che sarà figlia di SOAP :: StandaloneServer come segue:

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

NOTE- Se vuoi scrivere un server basato su FastCGI, devi prendere SOAP :: RPC :: CGIStub come classe genitore, il resto della procedura rimarrà la stessa.

Passaggio 2: definizione dei metodi del gestore

Il secondo passaggio consiste nello scrivere i metodi dei servizi Web che si desidera esporre al mondo esterno.

Possono essere scritti come semplici metodi Ruby. Ad esempio, scriviamo due metodi per aggiungere due numeri e dividere due numeri:

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

   # Handler methods
   def add(a, b)
      return a + b
   end
   def div(a, b) 
      return a / b 
   end
end

Passaggio 3: esporre i metodi del gestore

Il prossimo passo è aggiungere i nostri metodi definiti al nostro server. Il metodo di inizializzazione viene utilizzato per esporre i metodi di servizio con uno dei due metodi seguenti:

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

Ecco la descrizione dei parametri:

Sr.No. Parametro e descrizione
1

receiver

L'oggetto che contiene il metodo methodName. I metodi di servizio vengono definiti nella stessa classe del metodo methodDef, questo parametro è self .

2

methodName

Il nome del metodo chiamato a causa di una richiesta RPC.

3

paramArg

Specifica, quando forniti, i nomi dei parametri e le modalità dei parametri.

Per comprendere l'utilizzo dei parametri inout o out , considera il seguente metodo di servizio che accetta due parametri (inParam e inoutParam), restituisce un valore di ritorno normale (retVal) e due ulteriori parametri: inoutParam e outParam -

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

Ora possiamo esporre questo metodo come segue:

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

Passaggio 4: avviare il server

Il passaggio finale è avviare il server creando un'istanza della classe derivata e chiamando start metodo.

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

myServer.start

Ecco la descrizione dei parametri richiesti -

Sr.No. Parametro e descrizione
1

ServerName

Un nome di server, puoi dare quello che ti piace di più.

2

urn:ruby:ServiceName

Qui urna: ruby è costante ma puoi dare un nome ServiceName univoco per questo server.

3

hostname

Specifica il nome host su cui questo server ascolterà.

4

port

Un numero di porta disponibile da utilizzare per il servizio web.

Esempio

Ora, utilizzando i passaggi precedenti, scriviamo un server autonomo:

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

Quando viene eseguita, questa applicazione server avvia un server SOAP autonomo su localhost e ascolta le richieste sulla porta 8080. Espone un metodo di servizio, add e div , che accetta due parametri e restituisce il risultato.

Ora puoi eseguire questo server in background come segue:

$ ruby MyServer.rb&

Scrittura di client SOAP4R

La classe SOAP :: RPC :: Driver fornisce il supporto per la scrittura di applicazioni client SOAP. Questo capitolo descrive questa classe e dimostra il suo utilizzo sulla base di un'applicazione.

Di seguito sono riportate le informazioni minime necessarie per chiamare un servizio SOAP:

  • L'URL del servizio SOAP (SOAP Endpoint URL).
  • Lo spazio dei nomi dei metodi del servizio (Method Namespace URI).
  • I nomi dei metodi di servizio e i relativi parametri.

Ora scriveremo un client SOAP che chiamerebbe i metodi di servizio definiti nell'esempio precedente, denominato add e div .

Ecco i passaggi principali per creare un client SOAP.

Passaggio 1: creare un'istanza del driver SOAP

Creiamo un'istanza di SOAP :: RPC :: Driver chiamando il suo nuovo metodo come segue:

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

Ecco la descrizione dei parametri richiesti -

Sr.No. Parametro e descrizione
1

endPoint

URL del server SOAP a cui connettersi.

2

nameSpace

Lo spazio dei nomi da utilizzare per tutti gli RPC eseguiti con questo oggetto SOAP :: RPC :: Driver.

3

soapAction

Un valore per il campo SOAPAction dell'intestazione HTTP. Se nullo, il valore predefinito è la stringa vuota "".

Passaggio 2: aggiungere metodi di servizio

Per aggiungere un metodo di servizio SOAP a SOAP :: RPC :: Driver possiamo chiamare il seguente metodo utilizzando SOAP :: RPC :: Istanza di driver -

driver.add_method(name, *paramArg)

Ecco la descrizione dei parametri:

Sr.No. Parametro e descrizione
1

name

Il nome del metodo del servizio Web remoto.

2

paramArg

Specifica i nomi dei parametri delle procedure remote.

Passaggio 3: richiama il servizio SOAP

Il passaggio finale consiste nel fatturare il servizio SOAP utilizzando l' istanza SOAP :: RPC :: Driver come segue:

result = driver.serviceMethod(paramArg...)

Qui serviceMethod è il metodo del servizio web effettivo e paramArg ... è i parametri dell'elenco richiesti per passare il metodo del servizio.

Example

Sulla base dei passaggi precedenti, scriveremo un client SOAP come segue:

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

Ulteriori letture

Ti ho spiegato solo i concetti di base dei servizi Web con Ruby. Se vuoi approfondire ulteriormente, allora c'è il seguente link per trovare maggiori dettagli sui servizi Web con Ruby .