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