SOAP - Erste Schritte

  • Send this page to somebody
  • Print this page
Mit Zope einen SOAP-Server ansprechen (Original von vbachs)

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))
Created by dzugng
Last modified 09.04.2005 15:22