English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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.
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.
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:
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.
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
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:
Parametro | Descrizione |
---|---|
receiver | L'oggetto che contiene il nome del metodo. Se definisci un metodo di servizio nello stesso oggetto, questo parametro è self. |
methodName | il nome del metodo della richiesta RPC. |
paramArg | nomi 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) ])
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:
Parametro | Descrizione |
---|---|
ServerName | nome del servizio, puoi scegliere quello che preferisci |
urn:ruby:ServiceName | Ecco urn:ruby è fisso, ma puoi dare al tuo servizio un nome unico ServiceName |
hostname | indicare il nome dell'host |
port | porta del servizio web |
Prossimamente, seguendo i passaggi sopra, creiamo un servizio indipendente:
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 &
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:
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:
Parametro | Descrizione |
---|---|
endPoint | L'indirizzo URL del servizio SOAP |
nameSpace | Il namespace utilizzato per tutti gli RPC dell'oggetto SOAP::RPC::Driver. |
soapAction | Il valore del campo SOAPAction dell'intestazione HTTP. Se è una stringa vuota "", viene impostato di default a nil |
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:
Parametro | Descrizione |
---|---|
name | Il nome del metodo del servizio web remoto |
paramArg | Specificare i parametri del programma remoto |
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.
Sulla base dei passaggi sopra descritti, possiamo scrivere il seguente client SOAP:
#!/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