4

suds pythonを使用してWebServiceからデータを消費するpythonクライアントアプリケーションを構築しています。今のところ、リモート コールを実行して応答を取得できます。私の問題は、応答サイズが大きいことです-現在100Mbで、サイズは将来的に大きくなります。モデルの一部をリクエストできるようにする API を更新するように WebService プロバイダーにリクエストしましたが、今のところうまくいきません。

suds クライアントを次のように構成する方法を提案してください。

  • 応答メッセージにカスタム ストリーム パーサーを使用する - 必要な情報のみを抽出する
  • suds.sax.parser の実行を避け、応答ツリー全体を含む DOM オブジェクトを構築しない
  • また、パーサーが応答をディスク上のファイルに直接保存し、メモリに保存しないようにしたい (後者を実装するには、カスタムの suds トランスポートを渡す必要があると思います)
4

2 に答える 2

4

手元のタスクでは、質問の一部の解決策を見つけました。suds.plugin.MessagePlugin実装を使用して、WebService応答ペイロードの保存をクリアし、sudがそれをDOMに解析しないようにしています。それは私の最初の質問の項目2です:

suds.sax.parserの実行を避け、応答ツリー全体を含むDOMオブジェクトを構築しないでください

これは、パブリックWebサービスでこのアプローチを使用する例です。

要旨で完全なコードを見る

    import suds
    class PayloadInterceptor(suds.plugin.MessagePlugin):
        def __init__(self, *args, **kwargs):
            self.last_payload = None

        def received(self, context):
            #recieved xml as a string
            print "%s bytes received" % len(context.reply)
            self.last_payload = context.reply    
            #clean up reply to prevent parsing
            context.reply = ""
            return context

    if __name__=='__main__':    
        wsurl = "http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso?WSDL"
        payload_interceptor = PayloadInterceptor()
        client = suds.client.Client(wsurl, plugins=[payload_interceptor])
        print client
        res = client.service.CapitalCity("NL")
        print "received %s bytes" % len(payload_interceptor.last_payload)
        print "parsed result: %s" % res
        print "response payload: %s" % payload_interceptor.last_payload    

出力を生成します:

    ...    
    received 336 bytes
    parsed result: None
    response payload: <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Body>
        <m:CapitalCityResponse xmlns:m="http://www.oorsprong.org/websamples.countryinfo">
          <m:CapitalCityResult>Amsterdam</m:CapitalCityResult>
        </m:CapitalCityResponse>
      </soap:Body>
    </soap:Envelope>
于 2013-03-13T15:48:15.637 に答える
2

retxmlsuds が生の XML 応答を返すようにするオプションを使用して、解析と遅いオブジェクト ツリーの構築をバイパスできます。詳細については、 https ://fedorahosted.org/suds/ticket/257 を参照してください。

于 2015-05-19T12:16:55.203 に答える