2010-01-02 22 views
11

Esta pregunta se relaciona con: Python SOAP server/clientPython jabón usando soaplib (servidor) y espuma (cliente)

En el caso del jabón con Python, hay recomendación de utilizar soaplib (http://wiki.github.com/jkp/soaplib) como servidor de jabón y espuma (https://fedorahosted.org/suds/) como un cliente de jabón. Mi objetivo es crear servicios de soap en python que puedan ser consumidos por varios clientes (java, etc.). Probé el ejemplo HelloWorld de soaplib (http://trac.optio.webfactional.com/wiki/HelloWorld). Funciona bien cuando el cliente también está utilizando soaplib.

Luego, traté de usar espuma como cliente consumiendo los servicios HelloWorld y falla. -¿Por qué está pasando esto? ¿El servidor soaplib tiene problemas para ser consumido por diferentes clientes?

Aquí el código del servidor:

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() 

Este es el cliente soaplib:

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) 

Resultados:

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

Este es el cliente espuma:

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

Resultados:

>>> 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

acabo intenté hoy con las fuentes actuales y obtuve exactamente el mismo problema que el póster original. Agregar las declaraciones de importación no ayudó (de hecho, puedes mirar el código original y ver las primitivas importadas). – user343574

Respuesta

1

intenta importar primitivas en su clase:

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