第 8 章 使用带有附件的 SOAP 发送二进制数据
摘要
SOAP attachments 提供发送二进制数据的机制,作为 SOAP 消息的一部分。将 SOAP 与附件一起使用需要将 SOAP 消息定义为 MIME 多部分消息。
概述 复制链接链接已复制到粘贴板!
SOAP 消息通常不会传输二进制数据。但是,W3C SOAP 1.1 规范允许使用 MIME 多部分/相关消息来发送 SOAP 消息中的二进制数据。使用带有附件的 SOAP 称为这种技术。SOAP attachments 在 W3C 的 SOAP 消息中定义,并用附件注释。
命名空间 复制链接链接已复制到粘贴板!
用于定义 MIME 多部分/相关消息的 WSDL 扩展在命名空间 http://schemas.xmlsoap.org/wsdl/mime/ 中定义。
在随后的讨论中,假设此命名空间的前缀为 mime
。设置此值的 WSDL 定义
元素中的条目显示在 例 8.1 “合同中的 MIME 命名空间规格” 中。
例 8.1. 合同中的 MIME 命名空间规格
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
更改消息绑定 复制链接链接已复制到粘贴板!
在默认的 SOAP 绑定中,输入
、输出和
fault
元素的第一个子元素是描述用于代表数据的 SOAP 消息正文的 soap:body
元素。将 SOAP 与附件搭配使用时,soap:body
元素将替换为 mime:multipartRelated
元素。
WSDL 不支持使用 mime:multipartRelated
用于 故障
消息。
mime:multipartRelated
元素告知 Apache CXF 消息正文是一个多部分消息,可能包含二进制数据。元素的内容定义消息及其内容的部分。MIME:多部分
元素包含一个或多个 mime:part
元素,用于描述消息的各个部分。
第一个 mime:part
元素必须包含通常出现在默认 SOAP 绑定中的 soap:body
元素。其余的 mime:part
元素定义消息中发送的附件。
描述 MIME 多部分消息 复制链接链接已复制到粘贴板!
MIME 多部分消息使用 mime:multipartRelated
元素来描述,其中包含多个 mime:part
元素。要完全描述 MIME 多部分信息,您必须执行以下操作:
-
在您要作为 MIME 多部分消息发送的
输入或输出
消息中,添加一个mime:mulipartRelated
元素作为括起消息的第一个子元素。 -
将
mime:part
子元素添加到mime:multipartRelated
元素,并将其name
属性设置为唯一字符串。 添加
soap:body
元素作为mime:part
元素的子项,并相应地设置其属性。注意如果合同具有默认的 SOAP 绑定,您可以将
soap:body
元素从默认绑定中的对应消息复制到 MIME 多部分消息。-
将另一个
mime:part
子元素添加到mime:multipartReleated
元素,并将其name
属性设置为唯一字符串。 将
mime:content
子元素添加到mime:part
元素,以描述消息此部分的内容。要完全描述 MIME 消息部分的内容,
mime:content
元素具有以下属性:Expand 表 8.1. MIME:content 属性 属性 描述 + 指定来自父消息定义的 WSDL 消息部分的名称,该部分用作要在有线上的 MIME 多部分消息的内容。
+
此消息部分中的数据的 MIME 类型部分。MIME 类型定义为类型和子类型,使用语法类型
/
子类型。+
有很多预定义的 MIME 类型,如
image/jpeg
和text/plain
。MIME 类型由互联网编号分配机构(IANA)维护,并在 多用途互联网邮件扩展(MIME)中详细介绍:互联网消息 Bodies 和 Multipurpose Internet 邮件扩展(MIME)第 2 部分。+
- 对于每个额外的 MIME 部分,重复步骤 [i303819] 和 [i303821]。
示例 复制链接链接已复制到粘贴板!
例 8.2 “使用带有附件的 SOAP 的合同” 显示一个 WSDL 片段,用于定义以 JPEG 格式存储 X-rays 的服务。镜像数据 xRay
存储为 xsd:base64binary
,并打包成 MIME 多部分 imageData
。输入消息的剩余两个部分是 patientName
和 patientNumber
,作为 SOAP 正文的一部分在 MIME 多部分镜像的第一个部分中发送。
例 8.2. 使用带有附件的 SOAP 的合同