使用SOAP处理二进制数据

zig*_*ggy 5 java base64 spring soap web-services

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

看看谷歌,看起来有三种选择:

  • 在SOAP消息(Base64Binary)中将附件内联作为base64发送.
  • 在SOAP消息之外发送附件.即提到附件(SWA)
  • 在邮件外部发送附件,但使其看起来好像嵌入在邮件中(MTOM).

问题

  • 当他们说附件不在SOAP消息之外时,它到底意味着什么?我假设也许附件是作为一个不同的TCP包发送但我认为我错了?

  • 建议使用以上哪个选项,具体来说,哪个选项最适合Spring的Spring-WS框架?

  • 我不清楚上面哪个选项在传输过程中编码二进制内容.什么是二进制MIME,如下所述 - http://www.crosschecknet.com/intro_to_mtom.php?传输期间二进制数据是否仍然转换为文本?

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

小智 5

当他们说附件不在SOAP消息之外时,它到底意味着什么?我假设也许附件是作为一个不同的TCP包发送但我认为我错了?

与第一个选项相反,附件不是实际soap消息有效负载的一部分,而是在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: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
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

排队

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>
Run Code Online (Sandbox Code Playgroud)

建议使用以上哪个选项,具体来说,哪个选项最适合Spring的Spring-WS框架?

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

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

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

我不清楚上面哪个选项在传输过程中编码二进制内容.什么是二进制MIME,如下所述 - http://www.crosschecknet.com/intro_to_mtom.php?传输期间二进制数据是否仍然转换为文本?

MTOM和Inline都将文件编码为Base64encoded String.对于外部链接,这是不相关的.

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

Base64encoded字节数组