10

我有以下简单的 python 测试脚本,它使用Suds调用 SOAP Web 服务(该服务是用 ASP.net 编写的):

from suds.client import Client

url = 'http://someURL.asmx?WSDL'

client = Client( url )

result = client.service.GetPackageDetails( "MyPackage"  )

print result

当我运行此测试脚本时,出现以下错误(使用代码标记,因为它不换行):

No handlers could be found for logger "suds.bindings.unmarshaller"
Traceback (most recent call last):
  File "sudsTest.py", line 9, in <module>
    result = client.service.GetPackageDetails( "t3db"  )
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/client.py", line 240, in __call__
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/client.py", line 379, in call
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/client.py", line 240, in __call__
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/client.py", line 422, in call
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/client.py", line 480, in invoke
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/client.py", line 505, in send
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/client.py", line 537, in succeeded
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/bindings/binding.py", line 149, in get_reply
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/bindings/unmarshaller.py", line 303, in process
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/bindings/unmarshaller.py", line 88, in process
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/bindings/unmarshaller.py", line 104, in append
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/bindings/unmarshaller.py", line 181, in append_children
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/bindings/unmarshaller.py", line 104, in append
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/bindings/unmarshaller.py", line 181, in append_children
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/bindings/unmarshaller.py", line 104, in append
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/bindings/unmarshaller.py", line 181, in append_children
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/bindings/unmarshaller.py", line 102, in append
  File "build/bdist.cygwin-1.5.25-i686/egg/suds/bindings/unmarshaller.py", line 324, in start
suds.TypeNotFound: Type not found: 'xs:complexType'

查看 WSDL 文件头的源代码(重新格式化以适应):

<?xml version="1.0" encoding="utf-8" ?> 
<wsdl:definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" 
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
xmlns:s="http://www.w3.org/2001/XMLSchema" 
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:tns="http://http://someInternalURL/webservices.asmx" 
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" 
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" 
targetNamespace="http://someURL.asmx" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">

我根据输出的最后一行猜测:

suds.TypeNotFound: Type not found: 'xs:complexType'

我需要使用 Sud 的医生类来修复架构,但作为 SOAP 新手,我不知道在我的情况下究竟需要修复什么。这里有没有人有使用 Suds 修复/纠正架构的经验?

4

1 回答 1

14

Ewall的资源很好。如果您尝试搜索 suds trac 票证,您可能会看到其他人的问题与您的类似,但对象类型不同。这是从示例中学习以及它们如何导入名称空间的好方法。

问题是您的 wsdl 包含一个引用 (...) 的架构定义,但未能正确导入“ http://schemas.xmlsoap.org/soap/encoding/ ”命名空间(和关联的架构)。该模式可以在运行时使用模式 ImportDoctor 进行修补,如下所述: https ://fedorahosted.org/suds/wiki/Documentation#FIXINGBROKENSCHEMAs 。

这是一个相当普遍的问题。

通常引用的模式(未导入)是 SOAP 第 5 节编码模式。现在可以按如下方式修复:

(所有重点都是我的)。

您可以尝试这些文档提供的添加 WSDL 中提供的名称空间的行。这可能是一种试错法。

imp = Import('http://schemas.xmlsoap.org/soap/encoding/')
# Below is your targetNamespace presented in WSDL. Remember
# that you can add more namespaces by appending more imp.filter.add
imp.filter.add('http://someURL.asmx') 
doctor = ImportDoctor(imp) 
client = Client(url, doctor=doctor)

你没有提供你正在使用的 WSDL,我想你有理由不向我们展示......所以我认为你必须自己尝试这些可能性。祝你好运!

于 2009-09-01T04:33:49.647 回答