问题描述
我正在尝试使用 zeep 向 SOAP Web 服务 (WSDL) 发出请求,但我不知道为什么会出现此错误。 Web 服务正在使用 SOAP UI 工作。我想我没有以正确的方式在 python 中传递参数,但是我在 Zeep 文档中研究这是正确的,我在 Ubuntu 20.04 和 Windows 10 中对其进行了测试,两者都出现了相同的错误。
WSDL 文件:
<?xml version="1.0" encoding="UTF-8"?>
<deFinitions targetNamespace="http://infocomercial.cifin.asobancaria.com" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:intf="http://infocomercial.cifin.asobancaria.com" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://infocomercial.cifin.asobancaria.com" xmlns:tns1="http://dto.infocomercial.cifin.asobancaria.com" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
<!--WSDL created by Apache Axis version: 1.4
Built on Oct 06,2010 (02:39:27 GMT)-->
<wsdl:types>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://dto.infocomercial.cifin.asobancaria.com">
<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<complexType name="ParametrosConsultaDTO">
<sequence>
<element name="codigoInformacion" nillable="true" type="soapenc:string"/>
<element name="motivoConsulta" nillable="true" type="soapenc:string"/>
<element name="numeroIdentificacion" nillable="true" type="soapenc:string"/>
<element name="tipoIdentificacion" nillable="true" type="soapenc:string"/>
</sequence>
</complexType>
</schema>
</wsdl:types>
<message name="consultaXmlRequest">
<part name="in0" type="tns1:ParametrosConsultaDTO"/>
</message>
<message name="consultaXmlResponse">
<part name="consultaXmlReturn" type="soapenc:string"/>
</message>
<message name="consultaPlanorequest">
<part name="in0" type="tns1:ParametrosConsultaDTO"/>
</message>
<message name="consultaPlanoresponse">
<part name="consultaPlanoreturn" type="soapenc:string"/>
</message>
<message name="cambioPasswordRequest">
<part name="in0" type="soapenc:string"/>
</message>
<message name="cambioPasswordResponse">
<part name="cambioPasswordReturn" type="soapenc:string"/>
</message>
<portType name="InformacionComercialWS">
<operation name="consultaXml" parameterOrder="in0">
<input name="consultaXmlRequest" message="intf:consultaXmlRequest"/>
<output name="consultaXmlResponse" message="intf:consultaXmlResponse"/>
</operation>
<operation name="consultaPlano" parameterOrder="in0">
<input name="consultaPlanorequest" message="intf:consultaPlanorequest"/>
<output name="consultaPlanoresponse" message="intf:consultaPlanoresponse"/>
</operation>
<operation name="cambioPassword" parameterOrder="in0">
<input name="cambioPasswordRequest" message="intf:cambioPasswordRequest"/>
<output name="cambioPasswordResponse" message="intf:cambioPasswordResponse"/>
</operation>
</portType>
<binding name="InformacionComercialSoapBinding" type="intf:InformacionComercialWS">
<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="consultaXml">
<wsdlsoap:operation soapAction=""/>
<input name="consultaXmlRequest">
<wsdlsoap:body use="encoded" namespace="http://infocomercial.cifin.asobancaria.com" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output name="consultaXmlResponse">
<wsdlsoap:body use="encoded" namespace="http://infocomercial.cifin.asobancaria.com" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
<operation name="consultaPlano">
<wsdlsoap:operation soapAction=""/>
<input name="consultaPlanorequest">
<wsdlsoap:body use="encoded" namespace="http://infocomercial.cifin.asobancaria.com" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output name="consultaPlanoresponse">
<wsdlsoap:body use="encoded" namespace="http://infocomercial.cifin.asobancaria.com" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
<operation name="cambioPassword">
<wsdlsoap:operation soapAction=""/>
<input name="cambioPasswordRequest">
<wsdlsoap:body use="encoded" namespace="http://infocomercial.cifin.asobancaria.com" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output name="cambioPasswordResponse">
<wsdlsoap:body use="encoded" namespace="http://infocomercial.cifin.asobancaria.com" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
</binding>
<service name="InformacionComercialWSService">
<port name="InformacionComercial" binding="intf:InformacionComercialSoapBinding">
<wsdlsoap:address location="https://ttuweb3.universo.corp/InformacionComercialWS/services/InformacionComercial"/>
</port>
</service>
</deFinitions>
使用 SOAP UI 请求:
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:inf="http://infocomercial.cifin.asobancaria.com">
<soapenv:Header/>
<soapenv:Body>
<inf:consultaXml soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<in0 xsi:type="dto:ParametrosConsultaDTO" xmlns:dto="http://dto.infocomercial.cifin.asobancaria.com">
<codigoInformacion xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">1401</codigoInformacion>
<motivoConsulta xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">24</motivoConsulta>
<numeroIdentificacion xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">80775779</numeroIdentificacion>
<tipoIdentificacion xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">1</tipoIdentificacion>
</in0>
</inf:consultaXml>
</soapenv:Body>
</soapenv:Envelope>
我的python代码:
import requests
from requests import Session
from requests.auth import HTTPBasicAuth # or HTTPDigestAuth,or OAuth1,etc.
from zeep import Client
from zeep.transports import Transport
from zeep import xsd
from zeep.plugins import HistoryPlugin
from zeep.xsd import ComplexType
from lxml import etree
end_point= 'https://cifinpruebas.asobancaria.com/InformacionComercialWS/services/InformacionComercial?wsdl'
session = Session()
session.auth = HTTPBasicAuth("username","password")
session.cert='certificate.pem'
soap_client = Client(end_point,transport=Transport(session=session,timeout=60),service_name="InformacionComercialWSService",port_name="InformacionComercial")
parametros_consulta_dto = soap_client.get_type('ns0:ParametrosConsultaDTO')
parameters = parametros_consulta_dto(codigoInformacion="1401",motivoConsulta="24",numeroIdentificacion="80775779",tipoIdentificacion="1")
soap_client.service.consultaXml(parameters)
错误:
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='ttuweb3.universo.corp',port=443): Max retries exceeded with url: /InformacionComercialWS/services/InformacionComercial (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7f8e7d3d3af0>: Failed to establish a new connection: [Errno -2] Name or service not kNown'))
我已经花了几天时间寻找解决方案,但没有结果。谢谢。
编辑 1:SOAP UI 响应的图像
编辑 2:有关端点的 SOAP UI 信息的图像
另外,我按照本指南 reporting_bugs 测试了生成的 XML,并且我在 SOAP UI 中使用了它,它工作正常,我的参数没有问题,可能是在 SSL 身份验证中。
编辑 3:更改仅使用请求库的代码。 嗨,我决定仅使用请求库来测试soap 请求(也许zeep 可能会在身份验证中失败),但我确信这是来自网络服务提供商的服务器错误。
import requests
from requests import Session
from requests.auth import HTTPBasicAuth
cert_file="path to cert"
key_file="path to key"
endpoint='https://cifinpruebas.asobancaria.com/InformacionComercialWS/services/InformacionComercial?wsdl'
session = Session()
session.auth = HTTPBasicAuth("user","password")
body = """<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:inf="http://infocomercial.cifin.asobancaria.com">
<soapenv:Header/>
<soapenv:Body>
<inf:consultaXml soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<in0 xsi:type="dto:ParametrosConsultaDTO" xmlns:dto="http://dto.infocomercial.cifin.asobancaria.com">
<codigoInformacion xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">1401</codigoInformacion>
<motivoConsulta xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">24</motivoConsulta>
<numeroIdentificacion xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">80775779</numeroIdentificacion>
<tipoIdentificacion xsi:type="soapenc:string" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">1</tipoIdentificacion>
</in0>
</inf:consultaXml>
</soapenv:Body>
</soapenv:Envelope>"""
body = body.encode('utf-8')
session.headers = {"Content-Type": "text/xml; charset=utf-8"}
session.headers.update({"Content-Length": str(len(body))})
response = session.post(url=endpoint,data=body,cert=(cert_file,key_file))
print(response)
我使用的是 RSA PRIVATE KEY 和证书,但在响应中我收到以下错误:
<Response [500]>
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<soapenv:Fault>
<faultcode
xmlns:ns1="http://xml.apache.org/axis/">ns1:Client.NoSOAPAction
</faultcode>
<faultstring>no SOAPAction header!</faultstring>
<detail>
<ns2:hostname
xmlns:ns2="http://xml.apache.org/axis/">ttuweb3
</ns2:hostname>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
所以这是一个服务器错误,但我很困惑,因为我说请求正在使用 SOAP UI 工作。有什么解释吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)