【问题标题】:zeep soap12 wsdl+mtom+wsse how to make request?zeep soap12 wsdl+mtom+wsse 如何提出请求?
【发布时间】:2022-01-24 02:29:58
【问题描述】:

TPA.wsdl https://pastebin.com/7DBhCHbv 数据服务.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 解析失败

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

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

【问题讨论】:

  • 您是否尝试过在通话后立即使用断点?您可以在一个通用块中捕获所有错误,因此它可能与内容有关,也可能与一般调用有关。我建议在客户端初始化后立即添加一个断点,然后从那里逐步执行代码。
  • 如何在python中添加断点?
  • 假设你运行这个命令行。 Python2:导入pdb; pdb.set_trace()
  • Python3(.6 及以上我相信): breakpoint()

标签: python soap wsdl zeep wsse


【解决方案1】:

基于该 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 字符串)。

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

使用 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),但请注意以下事项:

这是为特定用途而开发的,此代码可能不应该用于(拥有它)用于其他目的。 (或您自担风险;))

因此,您似乎必须从头开始或从项目中的示例构建自己的多部分请求。

[...] 以及如何调试发送请求?

您可以使用HistoryPlugin 来查看您的客户端和服务器之间交换了哪些消息,但由于您可能需要查看所有请求,我建议您使用WiresharkTcpMon(旧的、已失效的,但仍然有用),或SoapUI with TcpMon

这可能不是您正在寻找的答案,但希望至少它能让您更有能力弄清楚如何拨打电话。不幸的是,Zeep 是a large pond of WS specifications 的小鱼客户。

【讨论】:

  • Ty,你能用mtom从python发送一段代码吗?或者如何使用 python-zeep-adv,因为没有手册存在
  • 很抱歉,编写完整的实现超出了我愿意分配给 Stackoverflow 社区的时间。您必须在我提供的帮助下自行解决此问题。但在你这样做之前,你真的需要编写一个 MTOM 实现吗?换句话说,您是否完成了我在回答前半部分中提到的事情?您是否确保发送正确的附件?你确定你只在base64中对文件编码过一次吗?您是否尝试过来自 SoapUI 的这种调用?就像我说的,基于那个 WSDL,一个更简单的调用应该可以在没有 MTOM 的情况下工作。
猜你喜欢
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多