【问题标题】:Handling binary data with SOAP使用 SOAP 处理二进制数据
【发布时间】:2012-04-01 20:44:07
【问题描述】:

我一直在研究如何使用 SOAP 消息处理二进制数据。我正在开发客户端和服务,所以我可以选择任何一个框架。唯一的限制是服务端已经设计好并且是基于 Spring-WS 的。

看google,貌似有三个选项:

  • 在 SOAP 消息 (Base64Binary) 中以 base64 格式发送内联附件。
  • 在 SOAP 消息之外发送附件。即参考附件 (SWA)
  • 在邮件外部发送附件,但使其看起来好像嵌入在邮件中 (MTOM)。

问题

  • 当他们说附件在 SOAP 消息之外是什么意思?我假设附件可能是作为不同的 TCP 包发送的,但我认为我错了?

  • 推荐以上哪些选项,具体来说,哪一个最适合 Spring 的 Spring-WS 框架?

  • 我不清楚上述哪些选项在传输过程中对二进制内容进行编码。这里描述的二进制 MIME 是什么 - http://www.crosschecknet.com/intro_to_mtom.php ?二进制数据在传输过程中是否仍然转换为文本?

  • 使用 SWA 时数据的格式是什么?

【问题讨论】:

  • 不能给你一个完整的答案,但这个链接应该有帮助:wso2.org/library/1148。向下看彩色图表。这是一个 mime 多部分消息,其中肥皂文本显示为一个部分,并通过其“Id”引用二进制部分。这不需要二进制的 base64 编码。这种方法非常普遍,并且是 http 标准,所以甚至不是肥皂
  • ... Cont ... 或特定于 Web 服务,所以如果您的框架不支持它,我会感到惊讶。 GL HTH
  • 看起来 mtom 透明地将 base 64 enc 数据转换为 mime 多部分消息,所以它是主题的变体!

标签: java web-services spring soap base64


【解决方案1】:

当他们说附件在 SOAP 消息之外是什么意思?我假设附件是作为不同的 TCP 包发送的,但我认为我错了?

与第一个选项相比,附件不是实际的 soap 消息负载的一部分,而是在 SOAP 文档中被引用。 MTOM 和 SWA 之间的区别在于引用文件的位置。对于 MTOM,它嵌入在响应中,而在 SWA 中,您可以例如获取网络上资源的链接。它遵循 3 个最小示例:

MTOM(xop+xml 类型的一站式响应)

Content-type: multipart/related;
type="application/xop+xml";
start-info="text/xml"

--uuid:c73c9ce8-6e02-40ce-9f68-064e18843428
Content-Type: application/xop+xml;charset=utf-8;type="text/xml"
Content-Transfer-Encoding: binary

<?xml version="1.0" ?>
  <S:Envelope xmlns:S="...">
     <S:Body>
      <ns2:downloadImageResponse xmlns:ns2="...">
         <return>
           <xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" 
         href="cid:012eb00e-9460-407c-b622-1be987fdb2cf@example.jaxws.sun.com">
           </xop:Include>
         </return>
      </ns2:downloadImageResponse>
     </S:Body>
   </S:Envelope>
--uuid:c73c9ce8-6e02-40ce-9f68-064e18843428
Content-Id: <012eb00e-9460-407c-b622-1be987fdb2cf@example.jaxws.sun.com>
Content-Type: image/png
Content-Transfer-Encoding: binary

SWA(仅供参考)

Content-Type: application/xml;charset=utf-8;

<?xml version="1.0" ?>
  <S:Envelope xmlns:S="...">
     <S:Body>
      <ns2:downloadImageResponse xmlns:ns2="...">
         <return>
           https://server.com/downloadImagehere.png
         </return>
      </ns2:downloadImageResponse>
     </S:Body>
   </S:Envelope>

内联

Content-Type: application/xml;charset=utf-8;

<?xml version="1.0" ?>
  <S:Envelope xmlns:S="...">
     <S:Body>
      <ns2:downloadImageResponse xmlns:ns2="...">
         <return>
           YTM0NZomIz...potentiallyLargeBase64encodedFileGoesInHere...I2OTsmIzM0NTueYQ==
         </return>
      </ns2:downloadImageResponse>
     </S:Body>
   </S:Envelope>

推荐以上哪些选项,具体来说,哪一个最适合 Spring 的 Spring-WS 框架?

它们都受支持,使用哪一种取决于您的用例。根据我的研究,MTOM 似乎是事实上的标准。根据我的说法,如果您有大文件或多个文件附件,它会特别有用。由于它将消息拆分为逻辑组件,因此它可能为解析器提供更多选项来有效地处理二进制数据。

但是,对于较小的数据,我可能会选择嵌入资源,因为它是标准 SOAP 协议的一部分,并且只直接使用编码字节数组,然后直接嵌入到消息中。如果可移植性/兼容性很重要,这可能是选择的方法。

最后一种方法显然需要您自己处理引用,这可能是也可能不是您想要的。

我不清楚上述哪些选项在传输过程中对二进制内容进行编码。这里描述的二进制 MIME 是什么 - http://www.crosschecknet.com/intro_to_mtom.php ?二进制数据在传输过程中是否仍然转换为文本?

MTOM 和 Inline 通常都将文件编码为 Base64 编码字符串。对于外部链接,它不相关。

使用SWA时数据的格式是什么?

Base64编码字节数组

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 2014-12-28
    • 2017-05-10
    • 2018-02-05
    • 1970-01-01
    • 2018-03-31
    • 2011-03-04
    • 1970-01-01
    相关资源
    最近更新 更多