【问题标题】:Get data from soap envelope zeep从肥皂信封zeep获取数据
【发布时间】:2016-11-01 19:29:55
【问题描述】:

我正在尝试在 python 库 zeep 的帮助下使用 wsdl。它工作正常,但我不知道如何从请求中获取数据。

我的代码:

# encoding=utf-8
from requests.auth import HTTPBasicAuth  # or HTTPDigestAuth, or OAuth1, etc.
from zeep import Client
from zeep import helpers
from zeep.transports import Transport
import logging.config

logging.config.dictConfig({
    'version': 1,
    'formatters': {
        'verbose': {
            'format': '%(name)s: %(message)s'
        }
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose',
        },
    },
    'loggers': {
        'zeep.transports': {
            'level': 'DEBUG',
            'propagate': True,
            'handlers': ['console'],
        },
    }
})
wsdl = 'wsdl_url'
user = 'login'
password = 'password'
my_transport = Transport(http_auth=HTTPBasicAuth(user, password))
client = Client(
    wsdl, transport=my_transport
)
result = client.service.FunctionName(...)
print result

结果,我明白了:

{
 'schema': <Schema(location=None)>,
 '_value_1': <Element {urn:schemas-microsoft-com:xml-diffgram- v1}diffgram at 0x104ec0098>
}

显然,这不是我想要的。感谢日志记录,我可以看到,实际上我通过信封获得了所需的信息:

我的问题是,如何访问信封内的数据(我需要 rowOrders,它部分显示在屏幕上)

【问题讨论】:

    标签: python soap wsdl


    【解决方案1】:

    使用 Zeep 2.4.0 版,我能够通过将 raw_response 选项传递给客户端来获得原始响应。这告诉客户端返回 Requests 响应对象。

    下面是示例代码:

    from zeep import Client
    
    wsdl = 'wsdl_url'
    
    client = Client(wsdl)
    
    with client.options(raw_response=True):
        soap_result = client.service.function_name(...)
    
    # Print out text from Requests response object returned    
    print soap_result.text
    

    【讨论】:

    • 使用 Zeep v.3.1.0 只需将 client.options 更改为 client.settings
    • 使用 Zeep v.4.1.0 它是 client.settings.raw_response = True
    【解决方案2】:

    我也遇到了同样的问题。所以我就是这样做的。这不是最好的方法,但它可以是一个开始,我希望制造商原谅我。 另外,我刚刚开始学习python。

    在此处克隆 zeep 项目: https://github.com/mvantellingen/python-zeep 并转到该文件夹​​。

    在transports.py中,在构造函数中加入这一行(_ init _):

    self.response = ''
    

    然后在方法post中,在返回响应之前,添加这一行:

    self.response = response
    

    在此之后,通过执行构建包

    python setup.py install
    

    这应该在您的 virtualenv 中(如果您正在使用)

    所以在你的代码中,你可以打印

    print my_transport.response.content
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2021-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多