带附件的请求消息

     带附件的SOAP消息(SOAP with Attachments,缩写SwA 或MIME for Web Services)是指使用Web服务,通过SOAP和MIME,主要使用HTTP协议,发送和接收邮件的方法。

     SOAP消息有时需要和不同类型的附件一同传输,可能是一个图像,或是一个二进制的文档,有时文件还很大。这种情况下,如果通过SOAP协议传送,传统的方式需要将附件转换为base64编码并插入到SOAP信封中,这样既不方便也造成效率问题。带附件的SOAP消息(SwA)提供了一种快捷的方式。 带附件的SOAP消息的HTTP请求消息(或应答消息)使用了Multipart/Related媒体类型发送,SOAP信封作为一个部分,附件作为其余的部分。在SOAP消息的Header条目或Body条目的子条目中都可以使用href属引用附件的URI。带附件的SOAP消息并非是一个新的规范,而是一个使用现有的SOAP和MIME手段,能够通过Web服务调用传输文件的一种机制。

    soap报文最外层元素为envelope,即soap信封。Envelope之下有2个子元素:Header和body。其中,body是soap报文的主要数据载体,该元素时必须的,用来存放交换的信息。

     在web service的实现中,经常需要在soap报文中携带各种类型的附件一起传输(可能是文本文件、二进制文件或者是图片等)。然而,soap是基于xml的文本协议,只能使用字符组成的文本来表示数据,无法再报文中直接使用其他格式的附件。因此,如何将soap报文同其他格式的附件组织在一起进行传输便成为一个需要解决的重要问题。

Base64 编码的二进制 SOAP 附件

为了简单和通用性,XML 被设计成了以文本的格式来表示数据。使用 SOAP 进行传递的数据首先被序列化,也就是将数据转换成字符串在 XML 文档中传送。在目的地,字符串再被反序列化,即再被转换成表示原来的值的数据类型。把二进制数据放入 SOAP 报文的最简单的方法,就是使用 Base64 编码的方式对其进行编码,以实现数据的序列化和反序列化。

Base64 是一种很常见的编码规范,其作用是将二进制序列转换为可读的 ASCII 字符序列,常用在需用通过文本协议传输二进制数据的情况下,例如 HTTP 和 SMTP 协议。Base64 编码基本原理是把每三个 8bit 的字节转换为四个 6bit 的字节,然后把 6bit 再添两位高位 0,组成四个 8bit 的字节,不满四个字节的以 '=' 填充。因为 Base64 将输入的数据编码成只含有 {'A'-'Z', 'a'-'z', '0'-'9', '+', '/'} 这 64 个字符的串,所以称之为 Base64 编码。可以看出,转换后的字符串理论上将要比原来的长 1/3。
尽管使用 Base64 编码能够将二进制数据放入 SOAP 报文中进行传输,然而,其效率非常低下。根据前面对 Base64 编码原理的分析,采用 Base64 编码将会引入 33% 的冗余尺寸,从而使 SOAP 消息变大;另外,对二进制数据进行编码和解码将造成较大的时间开销,严重影响应用程序的性能。鉴于这些问题,2000 年 12 月,W3C 组织推出了 SOAP 附件标准:SOAP Messages with Attachments (SwA) 规范,将 SOAP 附件置于 SOAP 主体之外,基于 MIME 技术实现了 SOAP 报文同 SOAP 附件的封装。


MIME消息由消息头和消息体两大部分组成。
SOAP附件标准SwA只针对SOAP1.1版本,其MIME类型为Multipart/Related,表示文档的多个部分是相关的。SOAP消息主体位于Multipart/Related结构的第一段,其content-type的值为text/xml,其余的为MIME段的soap附件。

SOAP 消息包
SOAP 消息包包含 XML 格式的主 SOAP 消息以及 SOAP 信封中未定义但与消息有关的任意数据格式(例如 gif、jpg 和 xml 等)的其它实体。
如 图 1所示,SOAP 消息包是用 MIME 的 Multipart/related 媒体类型构建的,每个部件都嵌入 MIME 边界(在 Context-Type 报头中定义)。每个 MIME 部件都有报头信息比如 Context-Type (它指定嵌入这个 MIME 部件的数据的类型)、 Content Transfer-encoding (指定用于这个 MIME 部件的编码)、 Content-ID 和/或 Content-Location (作为从 MIME 包的任何地方引用这些内容的标识符)。MIME 消息的根部件包含 SOAP 信封, Content-Type 被设置为 text/xml。

SOAP 消息由 MIME 头,一个封装主体 SOAP1.1 消息的 MIME 段和一个或多个封装 SOAP 附件的 MIME 段三部分组成。其中每部分以 MIME 边界分隔,Context-Type 用于指定 MIME 段的数据的类型、Content Transfer-encoding 用于指定用于 MIME 段的编码方式、Content-ID 或者 Content-Location 用于作为该 MIME 部件的标识符。


一个基于 SwA 的 SOAP 报文
               
POST /test HTTP/1.0
Content-Type: Multipart/Related; boundary=MIME_boundary; type=text/xml
Content-Length: XXXX
SOAPAction: http://www.soapattach.com/test

--MIME_boundary
Content-Type: text/xml; charset=UTF-8
Content-Transfer-Encoding: 8bit

<?xml version='1.0'?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<Car name="myCar">
<Picture href = “cid:[email protected]”/>
</Car>
</soap:Body>
</soap:Envelope>

--MIME_boundary
Content-Type: image/jpeg
Content-Transfer-Encoding: binary
Content-ID: <[email protected]>

...binary JPEG image...

--MIME_boundary--

你可能感兴趣的:(附件)