Suds:响应中未找到类型

4 投票
2 回答
8201 浏览
提问于 2025-04-16 15:40

我在用suds库创建一个Python的SOAP客户端时遇到麻烦,客户端构建得没问题,也能正确解析WSDL文件。根据我看到的,WSDL里没有任何导入,所以这看起来不像是典型的ImportDoctor问题。

WSDL中的相关部分:

        <xsd:complexType name="getFontsRequest">
            <xsd:sequence>
                <xsd:element name="UserID" type="xsd:int" maxOccurs="1" minOccurs="1"></xsd:element>
                <xsd:element name="TAWSAccessKey" type="xsd:string" maxOccurs="1" minOccurs="1"></xsd:element>
            </xsd:sequence>
        </xsd:complexType>

        <xsd:complexType name="getFontsResponse">
            <xsd:sequence>
                <xsd:element name="UserID" type="xsd:int"></xsd:element>
                <xsd:element name="Status" type="xsd:string"></xsd:element>
                <xsd:element name="Fonts" type="tns:FontType[]"></xsd:element>
            </xsd:sequence>
        </xsd:complexType>

        <xsd:complexType name="FontType">
            <xsd:sequence>
                <xsd:element name="ID" type="xsd:int"></xsd:element>
                <xsd:element name="Name" type="xsd:string"></xsd:element>
            </xsd:sequence>
        </xsd:complexType>

我的代码:

    self.soap_client = Client(settings.WSDL_URL)
    self.factory = self.soap_client.factory
    self.service = self.soap_client.service
    # ...
    getFontsRequest = self.factory.create('getFontsRequest')
    getFontsRequest.UserID = settings.WS_UID
    getFontsRequest.TAWSAccessKey = settings.WS_KEY

    self.service.getFonts(getFontsRequest)

最后一行抛出了这个异常:

...
File "/usr/local/Cellar/python/2.7.1/lib/python2.7/site-packages/suds/xsd/sxbasic.py", line 63, in resolve
raise TypeNotFound(qref)
TypeNotFound: Type not found: '(FontType[], http://www.type-applications.com/character_set/, )'

我的理解是,网络服务返回的是一个FontType对象的数组(也就是FontType[]),这在getFontResponse方法中有说明,但它没有定义FontType[]这个类型,只是描述了FontType

如果能帮我解决这个问题,我会非常感激。

2 个回答

6

这可能需要用到 ImportDoctor 这个工具。遇到损坏的 WSDL 文件其实是很常见的事情。

你可以试试这个:

from suds.client import Client
from suds.xsd.doctor import Import, ImportDoctor

wsdl_url = settings.WSDL_URL

# Fix missing types with ImportDoctor
schema_url = 'http://www.type-applications.com/character_set/'
schema_import = Import(schema_url)
schema_doctor = ImportDoctor(schema_import)

# Pass doctor to Client
client = Client(url=wsdl_url, doctor=schema_doctor)
2

这个问题是通过联系WSDL的提供者来解决的,要求他修复那个(坏掉的)WSDL。很遗憾,我不知道有什么代码方面的解决办法。

撰写回答