4

我正在构建 python 客户端应用程序以使用 suds python 使用来自 WebService 的数据。现在我可以进行远程调用并获得响应。我的问题是响应大小很大 - 现在为 100Mb,并且将来会增长。我已请求 WebService 提供者更新 API,这将允许我请求模型的一部分,但现在运气不佳。

请建议如何将 suds 客户端配置为:

  • 为响应消息使用自定义流解析器 - 这将提取我只需要的信息
  • 并避免运行 suds.sax.parser 并且不要构建包含整个响应树的 DOM 对象
  • 我还希望我的解析器将响应直接保存到磁盘上的文件中,而不是将其存储在内存中(为了实现后者,我认为我需要传递自定义的 suds 传输,这将为我这样做)
4

2 回答 2

4

对于我手头的任务,我找到了部分问题的解决方案 - 我正在使用suds.plugin.MessagePlugin实现来清除保存的 WebService 响应有效负载并防止 suds 将其解析为 DOM。这是我原来问题中的第 2 项:

避免运行 suds.sax.parser 并且不要构建包含整个响应树的 DOM 对象

下面是将此方法与公共 Web 服务一起使用的示例。

查看gist中的完整代码

    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

您可以使用retxml使 suds 返回原始 XML 响应的选项,绕过解析和缓慢的对象树构建。在此处阅读更多信息: https ://fedorahosted.org/suds/ticket/257 。

于 2015-05-19T12:16:55.203 回答