3

当我用 zeep 调用肥皂服务时,我正在尝试获取错误详细信息。

如何解析zeep.exceptions.Fault.detail?它返回 lxml.etree._Element。

我正在使用这段代码:

try:
    client = Client(wsdl=self.__wsdl)
    response = client.service.CustomerInformation(CustomerInformationService=self.service, faultStyle='wsdl')
except Fault as error:
    detail = error.detail
    # parse detail here

这是响应 XML:

<?xml version="1.0" ?>
<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
    <soap-env:Body >
        <soap-env:Fault  >
            <faultcode>soap-env:Client</faultcode>
            <faultstring>Client Error</faultstring>
            <detail>
                <ouaf:Fault xmlns:ouaf="urn:oracle:ouaf">
                    <ResponseStatus>F</ResponseStatus>
                    <ResponseCode>2013</ResponseCode>
                    <ResponseText>
                            Error while executing the request:
                            (Server Message)
                                Category: 90006
                                Number: 32200
                                Call Sequence: 
                                Program Name: CustomerInformationService
                                Text: The personal account was not found: 9134211141
                                Description:  
                                Table: null
                                Field: null
                    </ResponseText>
                    <ResponseData numParm="1"  text="The personal account was not found: 9134211141"  category="90006"  number="32200"  parm1="9134211141"  />
                </ouaf:Fault>
            </detail>
        </soap-env:Fault>
    </soap-env:Body >
</soap-env:Envelope>

我的 wsdl 中存在与 xml 数据的“故障”类型的区别。

4

2 回答 2

4

我知道这是一个老问题,但寻找答案让我来到这里,现在我也知道该怎么做。

示例中 wsdl 的 URL 和凭证一样组成。

import zeep

url_to_wsdl = 'www.some_SOAP_site.com/soap?wsdl'

client = zeep.Client(url_to_wsdl)

credentials = {
    'login' : 'my_login',
    'pass' : 'my_pass'
}

my_query = "SELECT COLUMN1 FROM TABLE1"

try:
    client.service.query(my_query)
except zeep.exceptions.Fault as fault:
    parsed_fault_detail = client.wsdl.types.deserialize(fault.detail[0])

print(parsed_fault_detail)

结果是

{
    'errorCode': 'INVALID_SESSION',
    'errorMessage': 'Invalid session!'
}

不要忘记[0]afterfault.detail并尝试增加它以查看是否有更多错误详细信息。

于 2019-05-13T15:16:09.017 回答
2

您可以使用error.codeorerror.message来匹配您要查找的错误。

https://github.com/mvantellingen/python-zeep/blob/master/src/zeep/exceptions.py#L53

如果您在 中看不到任何内容error.detail,请考虑向 python-zeep 项目发送 PR。

于 2017-03-30T15:51:15.583 回答