zeep soap12 wsdl+mtom+wsse 如何发起请求?

zeep soap12 wsdl+mtom+wsse how to make request?

TPA.wsdl https://pastebin.com/7DBhCHbv DataService.xsdhttps://pastebin.com/AFhg64hH


from zeep import Client
import base64
from requests import Session
from zeep.wsse.username import UsernameToken
from zeep.transports import Transport
from zeep.exceptions import Fault
Username = '....'
Password = '....'
sendFile = 'V07_220110.ffdata'

session = Session()
session.verify = False
try:
    wsdl = 'TPA.wsdl'

    # initialize zeep client
    client = Client(
    wsdl=wsdl,
    wsse=UsernameToken(Username, Password),
    transport=Transport(session=session)
    )

    with open(sendFile, "rb") as pdf_file:
        encoded_string = base64.b64encode(pdf_file.read())
    with client.options(raw_response=True):
        node = client.service.uploadEdasDraft(sendFile, encoded_string )
        print(node.content)

except Fault as fault:
    parsed_fault_detail = client.wsdl.types.deserialize(fault.detail[0])

总是得到回应

我收到错误 ORA-31011:XML 解析失败

从 SOAPUI 发送一切正常,启用 MTOM 设置

那么如何向它发出请求,以及如何调试发送请求?

基于该 WSDL 文件,代码如下:

from zeep import Client
from zeep.wsse.username import UsernameToken

username = 'username'
password = 'p@$$word'
file_name = 'test.txt'

client = Client(wsdl = 'TPA.wsdl', 
                wsse = UsernameToken(username, password))

with open(file_name, "rb") as f:
    content = f.read()

client.service.uploadEdasDraft(file_name, content)

应该产生这样的东西:

<soap-env:Envelope xmlns:soap-env="http://www.w3.org/2003/05/soap-envelope">
  <soap-env:Header>
     <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
        <wsse:UsernameToken>
           <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">p@$$word</wsse:Password>
        </wsse:UsernameToken>
     </wsse:Security>
  </soap-env:Header>
  <soap-env:Body>
     <ns0:uploadEdasDraft xmlns:ns0="http://types.data.external.ws.edas.sodra.epr.lt">
        <fileName>test.txt</fileName>
        <document>dGhpcyBpcyBhIHRlc3QNCnRoaXMgaXMgYSB0ZXN0DQp0aGlzIGlzIGEgdGVzdA0KdGhpcyBpcyBhIHRlc3QNCg==</document>
     </ns0:uploadEdasDraft>
  </soap-env:Body>
</soap-env:Envelope>

由于文档类型被标记为 xsd:base64Binary zeep 应该为您处理 base64 编码(您的代码似乎进行了两次编码)。

在上面的示例中,我使用的是文本文件,但我假设名为 V07_220110.ffdata 的文件是一个 XML 文件,因为这就是该属性的含义:xmime:expectedContentTypes="application/xml"。如果您不发送具有此内容类型的文件,服务器可能会抱怨。这也可能是“ORA-31011:XML 解析失败”消息以及双重编码的可能原因(服务器期望文档中有 XML,但发现了另一个 base64 字符串)。

From SOAPUI everything sending ok with Enable MTOM settings

使用 MTOM 时,您的文件不会在 SOAP 消息中编码为文本,而是作为二进制文件附加在它旁边,并且您会获得对该消息部分的引用。请在此处查看解释:How does MTOM work?

您的文档元素可能会更改为:

<document>
  <inc:Include href="cid:123456789" xmlns:inc="http://www.w3.org/2004/08/xop/include"/>
</document> 

其中 123456789 是对多部分消息中内容 ID 的引用。

只有启用 MTOM,您的调用才能从 SoapUI 进行吗?您是否尝试过使用 SoapUI 在 SOAP 消息中发送 base64 编码的文件字符串?

如果您的调用仅适用于 MTOM,那么您就有问题了,因为我不确定 zeep 是否可以开箱即用。

文档 (https://docs.python-zeep.org/en/master/attachments.html) 仅提及多部分响应以及如何从响应中读取文件,但未提及发出请求。例如,查看这些项目:

最后一个项目可能会对您提供一些代码示例 (https://github.com/remaudcorentin-dev/python-zeep-adv/blob/master/src/zeep/transport_with_attach.py),但请务必考虑以下警告:

This has been developed for a specific usage and this code should probably not be used (has it) for other puposes. (or at your own risks ;) )

看来您可能必须从头开始或从项目中的示例构建您自己的多部分请求。

[...] and how debug sending requests?

您可能会使用 HistoryPlugin just to see what messages get exchanged between your client and server, but since you might need to see all of the request, I suggest Wireshark, TcpMon (old, defunct, but still useful), or SoapUI with TcpMon.

这可能不是您正在寻找的答案,但希望它至少能让您更好地了解如何拨打电话。不幸的是,Zeep 是 a large pond of WS specifications.

的小鱼客户