2012-04-01 61 views
4

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

看着谷歌,它看起来像有三个选项:

  • 在线发送附件,如SOAP消息(使用Base64Binary)的base64。
  • 在SOAP消息外发送附件。即参考附件(SWA)
  • 在消息外发送附件,但使附件看起来好像它嵌入在消息(MTOM)中。

问题

  • 究竟这是什么意思时,他们说,attachement是SOAP消息之外?我想可能是附件是作为一个不同的TCP包发送的,但我认为我错了?

  • 上面哪个选项是推荐的,具体哪个最适合Spring的Spring-WS框架?

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

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

+0

不能给你一个完整的答案,但这个环节应该有所帮助:HTTP://wso2.org/library/1148。部分看到彩色图表。这是一个MIME多部分消息,肥皂文本显示为一个部分,并通过其“Id”引用二进制部分。这不需要二进制的base64编码。这种方法是相当普遍的,是一个HTTP标准等都不是连肥皂 – davidfrancis 2012-04-01 23:09:45

+0

... ...续或Web服务特定的,所以我会感到惊讶,如果你的框架不支持它。 GL HTH – davidfrancis 2012-04-01 23:10:42

+0

看起来像mtom透明地将base 64 enc数据变成MIME多部分消息,所以它是一个主题的变体! – davidfrancis 2012-04-01 23:13:31

回答

4

究竟这是什么意思时,他们说,attachement是SOAP消息之外?我想可能是附件是作为一个不同的TCP包发送的,但我认为我错了?

与第一个选项不同,附件不是实际肥皂消息有效负载的一部分,而是引用到SOAP文档中。 MTOM和SWA之间的区别在于引用文件的位置。对于MTOM,它嵌入到响应中,而在SWA中,您可以例如获取到Web上资源的链接。它遵循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:[email protected]"> 
      </xop:Include> 
     </return> 
     </ns2:downloadImageResponse> 
    </S:Body> 
    </S:Envelope> 
--uuid:c73c9ce8-6e02-40ce-9f68-064e18843428 
Content-Id: <[email protected]> 
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都将文件通常编码为Base64encoded字符串。对于外部链接,它不相关。

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

Base64encoded字节数组