首页 文章

使用Python将带附件的XML发送到SOAP ws

提问于
浏览
1

在过去的几周里,我一直在学习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 -encode中.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数据,这是虚构的数据 . 我使用Requests库做了一个请求,得到了一个XML,说服务器内部有错误 . 但我只是询问提供商,他们的WS正常运行 . 我可以通过使用SoapUI执行请求并获得我期望的错误来确认这一点 . 对不起,如果它很长 . 提前致谢 . Jajdp

1 回答

  • 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))
    

    现在脚本正常工作!

相关问题