【问题标题】:Python include file in XML messagePython 在 XML 消息中包含文件
【发布时间】:2017-06-03 01:02:49
【问题描述】:

目前我正在使用 Python 的 STOMP 库 (http://jasonrbriggs.github.io/stomp.py) 来发送和接收存储在 ActiveMQ 实例上的 SOAP 消息。此 ActiveMQ 连接到 WSO2 ESB,该 ESB 已配置为根据内容类型和/或 SoapAction 基本上重新排列不同框中的消息。

我目前正在使用一个 python 软件,并且只能使用某个帐户访问这个 ActiveMQ。我应该使用 stomp.py 向队列发送和接收。我只使用 SOAP 消息成功地做到了这两种方式。我会在 XML 中构建正文并将标题留空。

现在询问问题是使用带附件的 SOAP (SwA),因为附件也是必需的。我知道最终接收这些消息的系统还没有处理 MTOM,所以我只能发送 SwA 消息。

我已经在标头中提供了带有 application/octet-stream 的内容类型,但我终其一生都无法弄清楚如何将文件本身实际合并到这些消息中。

为了发送消息,我构建了 XML 正文、字典形式的标头并使用以下代码:

    conn = self._build_connection()[0]
    destination = self.subscription_id.queue_name
    # Connect to the server
    conn.connect(username=self.env.user.company_id.login_name, password=self.env.user.company_id.password)
    # Send the actual message out
    conn.send(destination, self.body, headers=self.header) 
    conn.disconnect()

"_build_connection" 只是为我提供了所需的 ActiveMQ 队列的连接。如果这与答案相关,请告诉我。

我觉得我非常接近一个可行的解决方案,但我只是失败了,所以缺少的链接。 ------------------ 编辑----------------

我发现我现在看错了方向。将附件插入 SOAP 消息是我的问题,而不是将消息发送到 ActiveMQ。我还注意到该消息将是单个文件/对 ActiveMQ 的调用,因此我需要重新表述我的问题。

也就是说,我目前正在尝试弄清楚如何使用 PySimpleSoap 来构建我的消息。成功后会更新。

----------------- EDIT2 ----------------

我的问题的改写。假设我有这个使用 Python 标准 ElementTree 库创建的简单肥皂消息:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tec="someURLtech">
   <soapenv:Header/>
       <soapenv:Body>
          <tec:SomethingTechnical>
              <tec:SomeValue>140</tec:SomeValue>
          </SomethingTechnical>
       </soapenv:Body>
   </soapenv:Envelope>

我想使用 SwA 添加一个附件,我必须确保它以某种方式位于信封内。

我已经找到了this link to another question on the differences between SwA and MTOM,但我只是看不到我应该在哪里指出该文件确实是一个图像(例如),以及在哪里放置实际的 base64 编码数据。注意:我知道如何获得这些,我只是询问如何以 XML 接受的方式定位这些。

询问的原因是目标应用程序 WSDL(很遗憾我不允许共享)确实有附件标签,但没有实际数据标签(如 )或类似的东西。

再一次,我觉得我完全错过了这里的重点,如果有人能解释一下,我将不胜感激。

另外请注意,我只需要根据提供的 WSDL 来制作消息,而不是实际使用 Web 服务。我将在 ActiveMQ 中的 ESB 上发布所述消息。我正在尝试使用 PySimpleSoap,但在那里也遇到了不同的问题,所以我没有通过验证 WSDL 文件。

【问题讨论】:

    标签: python soap attachment


    【解决方案1】:

    您应该四处搜索示例消息/示例。我已经链接了一个相关的 StackOverflow 问题。

    带有附件的 SOAP 是一个有多种方法的领域,您需要确保与目标服务保持一致。我建议使用像 SOAPUI 这样的工具来帮助制作消息负载,然后您可以手动对其进行测试。确定格式后,在 Python 中构建应该是直截了当的——要么使用现有的 Python SOAP 库,要么手动作为最后的手段。

    1. 相关SO问题:How to send a file through Soap in python?
    2. SOAP 用户界面:https://www.soapui.org/
    3. w3 规范:https://www.w3.org/TR/SOAP-attachments

    注意:这与 ActiveMQ 无关,因为无论 SOAP 是否带有附件,ActiveMQ 都将通过 STOMP 接受基于文本的有效负载。删除 ActiveMQ 标记以避免堆栈溢出管理员的愤怒可能是一个好主意。

    【讨论】:

    • 感谢您的回答。实际上,我已经使用 SoapUI 来测试某些功能,但我忘了提及这一点。另外,我会在明天的开篇文章中尝试更多地解释我“卡住”的地方。首先让我阅读提供的规格。
    • 我已经用更精确的描述编辑了原始问题。希望这只是显而易见的事情,可以很容易地指出。
    猜你喜欢
    • 2011-03-14
    • 1970-01-01
    • 2014-07-21
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多