配置suds以使用自定义响应xml解析器来获取大响应有效负载

时间:2013-03-06 23:04:26

标签: python suds

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

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

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

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:2)

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