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 .