【问题标题】:Spyne+Twisted SOAP Server gives 405 errorSpyne+Twisted SOAP 服务器给出 405 错误
【发布时间】:2014-02-15 06:13:02
【问题描述】:

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

【问题讨论】:

  • 即使浏览到 http://localhost:8000/ 也会得到 405
  • 顺便说一句,为什么不使用泡沫?
  • suds, python soap 客户端库。

标签: python soap twisted spyne


【解决方案1】:

?wsdl 位区分大小写。

http://localhost:8000/?wsdl 应该可以工作。

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

【讨论】:

  • 谢谢!它有效,但发生了另一个错误。我为它更新了问题。
  • 好的,我刚刚发布了应该可以解决问题的 2.10.10。请确认。
【解决方案2】:

这可能是soaplib错误;

我也遇到了这个问题: 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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    相关资源
    最近更新 更多