在过去的几周里,我一直在学习Python,并尝试将自定义XML发送到公共测试WS。现在,我觉得我没有任何进展。因此,我需要针对当前情况的帮助或任何建议。
如果您使用SoapUI或其他方法(我尝试过-mzeep)对其进行分析,那么Soap ws将要求以下代码。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.sunat.gob.pe"> <soapenv:Header/> <soapenv:Body>
<ser:sendBill>
<!--Optional:-->
<fileName>?</fileName>
<!--Optional:-->
<contentFile>?</contentFile>
<!--Optional:-->
<partyType>?</partyType>
</ser:sendBill> </soapenv:Body> </soapenv:Envelope>
但是WS实际需要的是这样的XML:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ser="http://service.sunat.gob.pe" xmlns:wsse="http://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<soapenv:Header>
<wsse:Security>
<wsse:UsernameToken>
<wsse:Username>?</wsse:Username>
<wsse:Password>?</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body>
<ser:sendBill>
<fileName>?</fileName>
<contentFile>?</contentFile>
</ser:sendBill>
</soapenv:Body>
</soapenv:Envelope>
是<contentFile>
上的值,它是在base64上编码的zip文件,其中包含XML文件。 WS文档专门要求将此字段编码为:
-使用实际数据创建XML结构。 -将其放入.zip -将.zip编码为base64格式 -最后将其附加到XML
到目前为止,我一直到将定制XML发送到WS为止。如果我使用SoapUI进行操作,则它将正常工作,因为它检测到无效的值,因此我将其放入基于base64编码的zip中的XML中(它返回一个映射的错误,提示“无效值”)。但是,如果我尝试使用Python使用它,则会从该WS收到错误消息,该消息未映射到WS提供程序提供的错误列表中。
这是我的代码。我确实阅读了Zeep文档,还向Python的Discord寻求帮助。
from zeep import Client, Settings
from zeep.wsse.username import UsernameToken
import base64
with open("20100066603-01-F001-1.zip", "rb") as f:
bytes = f.read()
encoded = base64.b64encode(bytes)
settings = Settings(strict=False, xml_huge_tree=True)
wsdl = 'https://e-beta.sunat.gob.pe/ol-ti-itcpfegem-beta/billService?wsdl'
client = Client(wsdl=wsdl, wsse=UsernameToken('20100066603MODDATOS', 'moddatos'), settings=settings)
node = client.create_message(client.service.sendBill('20100066603-01-F001-1.zip', encoded))
# response = client.service.sendBill('20100066603-01-F001-1.zip', b'bytes')
# print(client.service.sendBill('20100066603-01-F001-1.zip', b'encoded'))
# print(client.service.sendBill('20100066603-01-F001-1.zip', encoded))
# print(encoded.decode())
print(node)
我想知道我在python上做的是否正确。我想获得WS在发送测试数据时将传递的XML响应。 (我的目标是要与在SoapUI中发送请求时获得相同的错误消息)我之所以决定使用Zeep是因为它是我所能找到的最有据可查的SOAP请求库。正如我之前所说,我是python的新手,我确实需要使用此WS。如果这是一个重复的问题,请告诉我。或者,如果此问题可以与其他已回答的问题一起回答,请联系我。在对Zeep进行研究时,我注意到有人说Zeep不喜欢附件(它对附件的支持不好)。所以我想知道是否还有我可以使用的图书馆。如果是这样,请您给我一个例子?如果没有,您是否会向我推荐另一种编程语言及其库,我可以在其中成功执行此操作。这是我对StackO的第一个问题。 BTW不用担心pyhthon代码上的usernameToken数据,这是虚构的数据。 我使用请求库进行了请求,并得到一个XML,表明服务器内部错误。但是我只问提供商,他们的WS正常运行。我可以通过使用SoapUI进行请求并得到我期望的错误来确认这一点。很抱歉,如果很长。提前致谢。 Jajdp
答案 0 :(得分:0)
谁会想到用于将数据发送到SOAP的库通常会自动在base64上对文件进行编码。 我所做的所有代码都是正确的,但只有一部分。代替:
node = client.create_message(client.service.sendBill('20100066603-01-F001-1.zip', encoded))
应该是
node = client.create_message(client.service.sendBill('20100066603-01-F001-1.zip', bytes))
现在脚本可以正常工作了!