SOAP e’ un protocollo che permette di realizzare servizi accessibili da remoto, basato su XML e HTTP, e usabile quindi da quasi ogni piattaforma e linguaggio. Ruby ha avuto per molto tempo un’implementazione SOAP, detta SOAP4R, che e’ stata integrata nella distribuzione dell’interprete base dalla versione 1.8.1. Usando SOAP4R si possono realizzare client e server SOAP, manipolare file WSDL, e grazie ai binding con openssl usare servizi sicuri con HTTPS.
Scrivere un client SOAP in ruby e’ davvero semplice. Un buon posto per cercare servizi gratuiti e disponibili a tutti e’ xmethods.org.
Vediamo un esempio:require 'soap/rpc/driver' server = "http://services.xmethods.com/soap" namespace = "urn:xmethods-delayed-quotes" client = SOAP::RPC::Driver.new( server, namespace ) client.add_method( "getQuote", "symbol" ) azioni = ["RHAT", "IBM", "MSFT", "AMR", "LNUX", "NT", "TSG"] puts "Prezzi Azioni" puts "================" azioni.sort.each do |azione| printf("%6s %8.3f\n", azione, client.getQuote(azione)) end
Questo semplice script ci permette di conoscere i valori di mercato di alcune societa’.
Come funziona?
Semplice, un Driver), cioe’ un meccanismo che ci permette di accedere al servizio, viene creato usando un url ed un identificatore univoco ( urn ).
Subito dopo aggiungiamo all’oggetto un metodo, disponibile sul server, che rappresenta la richiesta che vogliamo effettuare.
Per aggiungere il metodo dobbiamo usare il suo nome (il primo parametro) ed il tipo di parametro che noi dovremo passargli (symbol in questo caso, in sostanza e’ una stringa). Queste sono tutte informazioni che deve fornire chi crea il servizio, non dovete inventarle :)
Prezzi Azioni ================ AMR 15.360 IBM 96.250 LNUX 3.748 MSFT 26.460 NT 7.660 RHAT 18.490 TSG 22.500Un’ultima nota: usando un WSDL, tutto questo puo’ essere automatizzato (vedere Client SOAP da WSDL per maggiori info)
Ecco un altro piccolo esempio. Sempre dal sito http://www.xmethods.net recuperiamo il servizio Romulan Numbers XLII che converte i numeri decimale in numeri romani e viceversa (se il nome del servizio non viene visualizzato nella lista presenta sulla home page cliccate su FULL LIST). Cliccando sul nome del servizio si accede alla pagina dove sono inserire alcune informazioni riquardanti il servizio stesso, in particolare ci interessa recupera i nomi dei metodi da invocare. Cliccando su View RPC Profile vi apre una finestra che visualizza le informazioni riquardanti i metodi messi a disposizione. Il servizio Romulan Numbers XLII mette a disposizione due metodi *IntToRoman IntToRomane * RomanToInt.
Vediamo come utilizzare le informazioni riportate: in particolaere interessa conoscere il nome del metodo, l’indirizzo URL del servizio, il namespace e i parametri di ingresso e di uscita. Ecco l’esempio esplicativo di come utilizzare i dati forniti dalla prima tabella, per la seconda il procedimento è analogo.
require 'soap/rpc/driver' # "Endpoint URL" server = "http://www.ebob42.com/cgi-bin/Romulan.exe/soap/IRoman" # "Method Namespace URI" namespace = "urn:Roman-IRoman" client = SOAP::RPC::Driver.new(server, namespace) # "Method Name" client.add_method("IntToRoman", "int") puts client.IntToRoman(19)