4

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/, )'

私の理解では、メソッドで指定されているように、Web サービスはFontTypeオブジェクトの配列 (つまり)を返しますが、型の定義に失敗し、 を説明するだけです。FontType[]getFontResponseFontType[]FontType

これを解決するための助けをいただければ幸いです。

4

2 に答える 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)
于 2011-04-13T22:18:39.917 に答える
2

この問題は、WSDL プロバイダーに連絡して (壊れた) WSDL を修正するよう依頼することで解決されました。残念ながら、この問題に対するコードベースの解決策は知りません。

于 2011-05-09T15:37:33.750 に答える