这是我的xml:
<?xml version="1.0"?>
<soapenv:Envelope>
<soapenv:Header xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<wsse:Security soap:mustUnderstand="1" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken wsu:Id="UsernameToken-1" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:Username>USERNAME</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">1234</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<root xmlns="http://xmlns.oracle.com/Enterprise/tools/schema/InfoRtRequest.v1">
<EMAIL>david</EMAIL>
</root>
</soapenv:Body>
</soapenv:Envelope>
这是我的演示:
wsdl = ''
client = Client(
wsdl,
wsse=UsernameToken('USERNAME', '1234'))
response = client.service.get_method(
EMAIL='david')
它引发了VadlidationError:
ValidationError: Missing element OPRID (root.OPRID)
我不知道为什么,请给我一些帮助,谢谢。
答案 0 :(得分:0)
zeep是用于处理python中SOAP通信的高级库。您应该提供wsdl文件,以便可以更好地分析您的问题。
但是通过查看您提供的xml请求,似乎认证是使用标头完成的,并且数据是在正文中发送的。与我最近修复的用例相似。请在下面参阅我的用例的xml请求。
<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
<soap-env:Header>
<ns0:myheaders xmlns:ns0="xxxxxx_stackoverflow_mask_xxxxxx">
<ns0:username>xxxxxx_stackoverflow_mask_xxxxxx</ns0:username>
<ns0:password>xxxxxx_stackoverflow_mask_xxxxxx</ns0:password>
</ns0:myheaders>
</soap-env:Header>
<soap-env:Body>
<ns0:Search02c xmlns:ns0="xxxxxx_stackoverflow_mask_xxxxxx">
<ns0:name>
<ns0:title>Mr</ns0:title>
<ns0:forename>Srikanth</ns0:forename>
<ns0:surname>Badveli</ns0:surname>
</ns0:name>
</ns0:Search02c>
</soap-env:Body>
</soap-env:Envelope>
对于上述xml,代码如下
from zeep import Client
header_credentials = {'username':'xxxxx','password':'xxxxx'}
tac_data = {'name': {'title':'xxxxx','forename':'xxxxx','surname':'xxxxx'}}
client = Client(wsdl=wsdl)
response = client.service.Search02c(tac_data, _soapheaders={'callcreditheaders':header_credentials})
在上面的代码中,“ Search02c”是该服务的操作名称。在检查wsdl文件时可以找到操作名称。在我的用例中,“ Search02c”接受2个参数,分别是正文和标头。“ tac_data”是xml正文(不是标头)的字典,“ header_credentials”是凭据的字典。您的用例可能接受单参数合并标头和正文。可以在检查的wsdl文件中的操作名称后找到参数结构。
通过在命令提示符下运行此操作,可以在输出末尾找到操作名称及其结构。
python -mzeep wsdl_file_path.wsdl
我的wsdl文件的操作如下。
Operations:
Search02c(searchDefinition: tac_data, _soapheaders={'headers': header_credentials}) -> outputResult: ns1:output
请记住,zeep仅接受字典作为输入数据,并提供字典作为输出。如果您希望以xml格式接收响应,请在客户端设置中使用raw_response = True。
有关更多信息,请参阅zeep documentation