2010-01-02 8 views
11

Diese Frage bezieht: Python SOAP server/clientPython Seife soaplib (Server) und Schaum (Client)

Im Fall von Seife mit Python gibt Empfehlung ist soaplib (http://wiki.github.com/jkp/soaplib) als SOAP-Server und Schaum zu verwenden (https://fedorahosted.org/suds/) als Soap-Client. Mein Ziel ist es, Soap-Dienste in Python zu erstellen, die von mehreren Clients (Java, etc) konsumiert werden können. Ich habe das Beispiel HelloWorld aus soaplib (http://trac.optio.webfactional.com/wiki/HelloWorld) versucht. Es funktioniert gut, wenn der Client auch soaplib verwendet.

Dann habe ich versucht, Seifenlauge als Client verbrauchen die HelloWorld-Dienste und es scheitern. -Warum ist das passiert? Hat der soaplib-Server Probleme mit verschiedenen Clients?

Hier ist der Code für den Server:

from soaplib.wsgi_soap import SimpleWSGISoapApp 
from soaplib.service import soapmethod 
from soaplib.serializers.primitive import String, Integer, Arraycode 
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 
#from cherrypy._cpwsgiserver import CherryPyWSGIServer 
# this example uses CherryPy2.2, use cherrypy.wsgiserver.CherryPyWSGIServer for CherryPy 3.0 
server = CherryPyWSGIServer(('localhost',7789),HelloWorldService()) 
server.start() 

Dies ist der soaplib Client:

from soaplib.client import make_service_client 
from SoapServerTest_1 import HelloWorldService 
client = make_service_client('http://localhost:7789/',HelloWorldService()) 
print client.say_hello("Dave",5) 

Ergebnisse:

>>> ['Hello, Dave', 'Hello, Dave', 'Hello, Dave', 'Hello, Dave', 'Hello, Dave'] 

Dies ist der Schaum-Client:

from suds.client import Client 
url = 'http://localhost:7789/HelloWordService?wsdl' 
client1 = Client(url) 
client1.service.say_hello("Dave",5) 

Ergebnisse:

>>> Unhandled exception while debugging... 
Traceback (most recent call last): 
    File "C:\Python25\Lib\site-packages\RTEP\Sequencing\SoapClientTest_1.py", line 10, in <module> 
    client1.service.say_hello("Dave",5) 
    File "c:\python25\lib\site-packages\suds\client.py", line 537, in __call__ 
    return client.invoke(args, kwargs) 
    File "c:\python25\lib\site-packages\suds\client.py", line 597, in invoke 
    result = self.send(msg) 
    File "c:\python25\lib\site-packages\suds\client.py", line 626, in send 
    result = self.succeeded(binding, reply.message) 
    File "c:\python25\lib\site-packages\suds\client.py", line 658, in succeeded 
    r, p = binding.get_reply(self.method, reply) 
    File "c:\python25\lib\site-packages\suds\bindings\binding.py", line 158, in get_reply 
    result = unmarshaller.process(nodes[0], resolved) 
    File "c:\python25\lib\site-packages\suds\umx\typed.py", line 66, in process 
    return Core.process(self, content) 
    File "c:\python25\lib\site-packages\suds\umx\core.py", line 48, in process 
    return self.append(content) 
    File "c:\python25\lib\site-packages\suds\umx\core.py", line 63, in append 
    self.append_children(content) 
    File "c:\python25\lib\site-packages\suds\umx\core.py", line 140, in append_children 
    cval = self.append(cont) 
    File "c:\python25\lib\site-packages\suds\umx\core.py", line 61, in append 
    self.start(content) 
    File "c:\python25\lib\site-packages\suds\umx\typed.py", line 77, in start 
    found = self.resolver.find(content.node) 
    File "c:\python25\lib\site-packages\suds\resolver.py", line 341, in find 
    frame = Frame(result, resolved=known, ancestry=ancestry) 
    File "c:\python25\lib\site-packages\suds\resolver.py", line 473, in __init__ 
    resolved = type.resolve() 
    File "c:\python25\lib\site-packages\suds\xsd\sxbasic.py", line 63, in resolve 
    raise TypeNotFound(qref) 
TypeNotFound: Type not found: '(string, HelloWorldService.HelloWorldService,)' 
+1

ich nur versuchte heute mit aktuellen Quellen und bekam genau das gleiche Problem wie das Originalplakat. Das Hinzufügen der Importanweisungen hat nicht geholfen (tatsächlich können Sie den Originalcode ansehen und die importierten Grundelemente sehen). – user343574

Antwort

1

try Primitiven in Ihre Klasse zu importieren:

class HelloWorldService(SimpleWSGISoapApp): 
    from soaplib.serializers.primitive import String, Integer, Arraycode 
    @soapmethod(String,Integer,_returns=Array(String))