Deutsche Zope User Group
Gast 2 Benutzer online
DZUG-News

SOAP - Erste Schritte

Mit Zope einen SOAP-Server ansprechen

Scope dieses Artikels ist nur die elementare Verwendung von SOAPpy

Zun�chst ben�tigt man SOAPpy. In einem Debian-System braucht es dazu nur eines:
apt-get install python-soappy
Bei Sourceforge findet sich das Modul unter: http://sourceforge.net/projects/pywebsvcs
Sollte man mehrere Pythonversionen installiert haben, muss das Module (einschlie�lich des XML-Modules) ggf. noch in /site-packages der vom Zope verwendeten Pythonversion umkopieren.

Damit sp�ter keine Encoding-Probleme auftreten, kann man in diesem Zusammenhang auch gleich eine sitecustomize.py in /site-packages hinterlegen

#sitecustomize.py

#-----------------------------------------------------------------------------
import sys

sys.setdefaultencoding('iso-8859-1')

Als n�chstes braucht man einen SOAP-Provider (Server).
Hier ein einfaches Beispiel:

provider.py

#-----------------------------------------------------------------------------
from SOAPpy import Server

class math:
    
    def __init__(self):
        self.result = 0

    def worker_reset(self,args):
        self.result = 0

    def worker_multiply(self,args):
        temp = 1
        for x in args:
            temp = x*temp
        self.result = temp + self.result

    def worker_add(self,args):
        temp = 0
        for x in args:
            temp = x+temp
        self.result = temp + self.result

class strng:
    
    def __init__(self):
        self.result = ""
        
    def worker_reset(self,args):
        self.result = ""
        
    def worker_reflect(self,args):
        for x in args:
            self.result = self.result + x

m = math()
s = strng()

def dispatch(obj="",func="",args=()):
    klasses = {'math':m, 'string':s}
    klass = klasses[obj]
    function = getattr(klass,"worker_%s" % func)
    function(args)
    return klass.result

server = Server.SOAPServer(('localhost',8031))
server.registerFunction(dispatch)
server.serve_forever()

Der Server bietet eine Klasse mit Methoden zum Addieren und Multiplizieren und eine Klasse, die Strings zusammenzuf�gt und reflektiert. Interessant ist eigentlich nur die Funktion dispatch(). Damit werden die Methoden aus den Klassen aufgerufen. Beispiel:
dispatch('math','multiply',(2,2,2))
dispatch('string','reflect','���')

Dieser Server soll zum Testen dienen, also l�sst man ihn neben dem Zope laufen:
python provider.py

Jetzt ist nur noch ein Script als Client f�r den SOAP-Provider erforderlich:

client.py

#-----------------------------------------------------------------------------
# -*- coding: iso-8859-1 -*-

from SOAPpy import Client

server = Client.SOAPProxy("http://localhost:8031",encoding="iso-8859-1")


def soap(klass="",func="",args=()):
    return server.dispatch(klass,func,args)

Die zweite Zeile ist ab Python2.3 interessant, damit wird das Encoding gesetzt (Siehe PEP 0263). Ansonsten ist der Client unspektakul�r. Er stellt eine Funktion soap() zur Verf�gung, die ihrerseits nur die Parameter an den Server weitergibt und das Ergebnis des Servers zur�ckgibt. Das Script wird einfach in /Extensions kopiert.

Im Zope wird client.py als Externe Methode eingebunden und dann etwa mit einem Python-Script mit den Parametern aufgerufen. Also:

Externe Methode client.py

Id soap
Title Soap
Module Name client
Function Name soap

Python-Script test_py

## Script (Python) "test_py"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=
##title=
##
context.soap('math','reset',())
return context.soap('math','multiply',(2,2))

Geschrieben von vbachs . Letzte �nderung 29.12.2003 13:00.