使用 Python 将附件发送到 SOAP ws XML
Send XML with attachment to SOAP ws using Python
过去几周我一直在学习 Python 并尝试将自定义 XML 发送到 public 测试 WS。现在我觉得我没有取得任何进展。所以我需要帮助或针对我目前情况的任何建议。
如果您使用 SoapUI 或其他方法(我试过 -mzeep)对其进行分析,Soap 将要求以下代码。
<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 的无效值(它 returns 映射错误说 "invalid value")。但是,如果我尝试使用 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。如果这是一个重复的问题,请告诉我。或者,如果这个问题可以用其他已回答的问题来回答,请 link 我给他们。在做一些关于 Zeep 的研究时,我注意到有人说 Zeep 不喜欢附件(它对附件的支持不好)。所以我想知道我是否可以使用另一个图书馆。如果是这样,请你给我举个例子好吗?如果没有,你会推荐我另一种编程语言和它的库,我可以在其中成功地做 this.This 是我在 StackO 上的第一个问题。顺便说一句,不要担心 python 代码上的 usernameToken 数据,那是虚构的数据。
我使用 Requests 库发出了一个请求,得到一个 XML 说有一个服务器内部错误。但是我问了提供者,他们的 WS 运行正常。我可以通过使用 SoapUI 发出请求并得到我预期的错误来确认这一点。对不起,如果它很长。提前致谢。 Jajdp
谁会想到用于将数据发送到 SOAP ws 的库通常会自动在 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))
现在脚本可以正常工作了!
过去几周我一直在学习 Python 并尝试将自定义 XML 发送到 public 测试 WS。现在我觉得我没有取得任何进展。所以我需要帮助或针对我目前情况的任何建议。
如果您使用 SoapUI 或其他方法(我试过 -mzeep)对其进行分析,Soap 将要求以下代码。
<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 的无效值(它 returns 映射错误说 "invalid value")。但是,如果我尝试使用 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。如果这是一个重复的问题,请告诉我。或者,如果这个问题可以用其他已回答的问题来回答,请 link 我给他们。在做一些关于 Zeep 的研究时,我注意到有人说 Zeep 不喜欢附件(它对附件的支持不好)。所以我想知道我是否可以使用另一个图书馆。如果是这样,请你给我举个例子好吗?如果没有,你会推荐我另一种编程语言和它的库,我可以在其中成功地做 this.This 是我在 StackO 上的第一个问题。顺便说一句,不要担心 python 代码上的 usernameToken 数据,那是虚构的数据。 我使用 Requests 库发出了一个请求,得到一个 XML 说有一个服务器内部错误。但是我问了提供者,他们的 WS 运行正常。我可以通过使用 SoapUI 发出请求并得到我预期的错误来确认这一点。对不起,如果它很长。提前致谢。 Jajdp
谁会想到用于将数据发送到 SOAP ws 的库通常会自动在 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))
现在脚本可以正常工作了!