配置suds以使用定制的响应xml解析器来处理大响应负载

2024-07-03 04:26:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建python客户机应用程序,以使用sudspython从web服务中使用数据。 现在我可以进行远程呼叫并获得响应。 我的反应是,现在的问题是100Mb的大小。 我已经请求WebService提供者更新API,这将允许我请求me模型的部分内容,但目前运气不太好。在

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

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

Tags: 数据模型apiweb应用程序解析器内容客户机
2条回答

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

avoid running suds.sax.parser and do not build DOM object containing whole response tree

下面是在公共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    

产出:

^{pr2}$

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

相关问题 更多 >