Python包含XML消息中的文件

时间:2017-01-18 15:17:10

标签: python soap attachment

目前我正在使用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库创建了这个简单的soap消息:

<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构建消息,而不是实际使用webservice。我将在ActiveMQ中的ESB上发布消息。我正在尝试使用PySimpleSoap,但也遇到了不同的问题,所以我没有过去验证WSDL文件。

1 个答案:

答案 0 :(得分:0)

你应该谷歌周围的示例消息/示例。我已经链接了一个相关的StackOverflow问题。

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

  1. 相关问题:How to send a file through Soap in python?
  2. SOAP UI:https://www.soapui.org/
  3. w3规范:https://www.w3.org/TR/SOAP-attachments
  4. 注意:这与ActiveMQ无关,因为ActiveMQ将通过STOMP接受基于文本的有效负载,无论带有或不带附件的SOAP。删除ActiveMQ标记可能是一个好主意,以避免堆栈溢出保管人的愤怒。