Bookmark and Share
Document Actions

Usare SoapLib
difficile

SoapLib permette di realizzare applicazioni WSGI che implementano il protocollo SOAP. Vediamo come.

Soaplib è una libreria molto semplice e "pythonica" per scrivere web service soap come applicazioni wsgi.
Ecco un primo esempio riportato dalla documentazione ufficiale:

from soaplib.wsgi_soap import SimpleWSGISoapApp
from soaplib.service import soapmethod
from soaplib.serializers.primitive import String, Integer, Array
class HelloWorldService(SimpleWSGISoapApp):
    @soapmethod(String,Integer,_returns=Array(String))
    def say_hello(self,name,times):
        results = []
        for i in range(0,times):
            results.append('Hello, %s'%name)
        return results
if __name__=='__main__':
    from cherrypy.wsgiserver import CherryPyWSGIServer
    server = CherryPyWSGIServer(('localhost',7789),HelloWorldService())
    server.start()

Per utilizzare l'oggetto da remoto dovrò fare:

>>> from soaplib.client import make_service_client
>>> from helloworld import HelloWorldService
>>> client = make_service_client('http://localhost:7789/',HelloWorldService())
>>> print client.say_hello("Dave",5)
['Hello, Dave','Hello, Dave','Hello, Dave','Hello, Dave','Hello, Dave']

Analizziamo ora l'esempio:
Il metodo say_hello della classe HelloWorldService sarà esposto pubblicamente e, una volta ottenuto un istanza dell'oggetto da remoto con client = make_service_client('http://localhost:7789/',HelloWorldService())
potrò richiamare il metodo con client.say_hello(...) utilizzando la classe HelloWorldService come se fosse definita in locale.

Da quello che abbiamo visto precedentemente questo oggetto non assomiglia ad una applicazione wsgi !!!
La magia sta dietro alla superclasse SimpleWSGISoapApp. Questa ha infatti un metodo speciale __call__ che è la nostra funzione wsgi:

def __call__(environ, start_response)
...

Infatti bisogna notare che viene passata un istanza di HelloWorldService

server = CherryPyWSGIServer(('localhost',7789),HelloWorldService())

e non un riferimento

server = CherryPyWSGIServer(('localhost',7789),HelloWorldService) # errato !!!!

I decoratori @soapmethod servono a definire quali metodi rendere pubblici e con quali tipi standard devono essere mappati.

I tipi utilizzabili sono contenuti nel package serializers. Sono presenti tipi primitivi come Integer, String, Float, DateTime, Boolean.
E' possibile definire utilizzare delle liste tramite il tipo Array. In questo caso è necessario che la lista contenga valori dello stesso tipo. Per esempio Array(String) sarà un array di stringhe.
L'argomento _return determinerà il tipo del valore di ritorno del metodo.
Tornando al nostro esempio

    @soapmethod(String,Integer,_returns=Array(String))
    def say_hello(self,name,times):
    . . .

Il metodo say_hello prenderà come argomenti:
- uno String mappato come stringa nel parametro name
- un Integer mappato come intero nel parametro times
e restituirà in output Array(String) che verrà mappato come una lista di stringhe

ecco infatti il client

>>> print client.say_hello("Dave",5)
['Hello, Dave','Hello, Dave','Hello, Dave','Hello, Dave','Hello, Dave'
 
by Maurizio Lupo last modified 2009-04-03 12:46