我正在尝试使用 Spyne+Twisted 实现一个 python SOAP 服务器。
这是示例服务器代码
import logging
logging.basicConfig(level=logging.DEBUG)
from spyne.application import Application
from spyne.decorator import srpc
from spyne.service import ServiceBase
from spyne.model.primitive import Integer
from spyne.model.primitive import Unicode
from spyne.model.complex import Iterable
from spyne.protocol.soap import Soap11
from spyne.server.twisted import TwistedWebResource
from twisted.internet import reactor
from twisted.web.server import Site
class HelloWorldService(ServiceBase):
@srpc(Unicode, Integer, _returns=Iterable(Unicode))
def say_hello(name, times):
for i in range(times):
yield 'Hello, %s' % name
application = Application([HelloWorldService],
tns='spyne.examples.hello',
in_protocol=Soap11(),
out_protocol=Soap11()
)
if __name__ == '__main__':
resource = TwistedWebResource(application)
site = Site(resource)
reactor.listenTCP(8000, site, interface='0.0.0.0')
reactor.run()
很简单。
这是客户端代码:
from pysimplesoap.client import SoapClient
import sys
if __name__ == '__main__':
client = SoapClient(wsdl="http://{0}:{1}/?WSDL".format(sys.argv[1], sys.argv[2]))
response = client.add_job('black')
print 'result is ', response['add_jobResult']
我运行客户端python client.py localhost 8000
这是客户给我的:
No handlers could be found for logger "pysimplesoap.simplexml"
Traceback (most recent call last):
File "client.py", line 22, in <module>
client = SoapClient(wsdl="http://{0}:{1}/?WSDL".format(sys.argv[1], sys.argv[2]))
File "/usr/local/lib/python2.7/dist-packages/PySimpleSOAP-1.10-py2.7.egg/pysimplesoap/client.py", line 133, in __init__
self.services = wsdl and self.wsdl_parse(wsdl, cache=cache)
File "/usr/local/lib/python2.7/dist-packages/PySimpleSOAP-1.10-py2.7.egg/pysimplesoap/client.py", line 471, in wsdl_parse
wsdl = SimpleXMLElement(xml, namespace=wsdl_uri)
File "/usr/local/lib/python2.7/dist-packages/PySimpleSOAP-1.10-py2.7.egg/pysimplesoap/simplexml.py", line 196, in __init__
self.__document = xml.dom.minidom.parseString(text)
File "/usr/lib/python2.7/xml/dom/minidom.py", line 1931, in parseString
return expatbuilder.parseString(string)
File "/usr/lib/python2.7/xml/dom/expatbuilder.py", line 940, in parseString
return builder.parseString(string)
File "/usr/lib/python2.7/xml/dom/expatbuilder.py", line 223, in parseString
parser.Parse(string, True)
xml.parsers.expat.ExpatError: syntax error: line 1, column 0
此外,浏览到http://localhost:8000/?WSDL
给出了这个:
405 Method Not Allowed
现在,我该怎么办?提前致谢
更新:浏览到?wsdl
(注意小写)405错误消失后,但这是我之后得到的: