Spyne + Twisted SOAP Server出现405错误

时间:2014-02-15 06:13:03

标签: python soap twisted spyne

我正在尝试使用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错误消失了,但这是我之后得到的:

Error

2 个答案:

答案 0 :(得分:0)

?wsdl位区分大小写。

http://localhost:8000/?wsdl应该有用。

“浏览到http://localhost:8000/”表示“向http://localhost:8000/发出GET请求”,这是在通过HTTP执行SOAP时禁止的 - SOAP端点只接受POST请求,因此405。

答案 1 :(得分:0)

这可能是soaplib bug;

我也遇到了这个问题:    http://localhost:8000/?wsdl没问题    http://localhost:8000/?WSDL将是405错误

我修改了soaplib wsgi.py以解决问题(/usr/local/lib/python2.7/dist-packages/soaplib-2.0.0b2-py2.7.egg/soaplib/core/server/wsgi.py)

修改内容如下:

req_env['QUERY_STRING'].endswith('wsdl') or req_env['PATH_INFO'].endswith('wsdl')  or req_env['QUERY_STRING'].endswith('WSDL') or req_env['PATH_INFO'].endswith('WSDL')