第 8 章 使用带有附件的 SOAP 发送 Binary 数据
摘要
SOAP 附加提供了一种将二进制数据作为 SOAP 消息的一部分发送的机制。使用带有附件的 SOAP 要求您将 SOAP 消息定义为 MIME 多部分消息。
概述
SOAP 消息通常不会执行二进制数据。但是,W3C SOAP 1.1 规范允许使用 MIME 多部件/相关消息在 SOAP 消息中发送二进制数据。使用 SOAP 与附加功能调用这一技术。SOAP 附加功能在 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/"
更改消息绑定
在默认的 SOAP 绑定中,输入、 元素的第一个子元素是描述代表数据的 SOAP 消息正文的 输出和错误 soap:body 元素。当使用带有附件的 SOAP 时,soap:body 元素替换为 mime:multipartRelated 元素。
WSDL 不支持将 mime:multipartRelated 用于 错误消息。
mime:multipartRelated 元素告诉 Apache CXF,消息正文是一个可能包含二进制数据的多部件信息。元素的内容定义消息及其内容。MIME:multipartRelated 元素包含一个或多个 mime:part 元素,用于描述消息的各个部分。
第一个 mime:part 元素必须包含通常在默认的 SOAP 绑定中的 soap:body 元素。剩余的 mime:part 元素定义在消息中发送的附件。
描述 MIME 多部分信息
MIME 多部件使用 mime:multipartRelated 元素 来描述。要完全描述 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元素有以下属性:表 8.1.
MIME:content属性属性 描述 + 指定来自父消息定义中的 WSDL 消息
部分的名称,该名称用作 MIME 多部件在线上放置的 MIME 多部件的内容。+
此消息部分中数据的 MIME 类型。MIME 类型定义为类型,子类型使用语法 类型
/子类型。+
有很多预定义的 MIME 类型,如
image/jpeg和text/plain。MIME 类型由互联网编号授权机构(IANA)维护,并在 多用途 Internet 邮件扩展(MIME)中详细介绍:Internet Message Bodies 和 多用途 Internet 邮件扩展(MIME)第 2 部分的内容。+
- 对于每个额外的 MIME 部分,重复步骤 [i303819] 和 [i303821]。
示例
例 8.2 “使用带有附件的 SOAP 的合同” 显示 WSDL 片段,它定义了以 JPEG 格式存储 X-rays 的服务。镜像数据 xRay 存储在 xsd:base64 二进制代码 中,并打包成 MIME 多部件的第二个部分 imageData。输入消息的两部分 patientName 和 patientNumber 在 MIME 多部件镜像的第一部分中作为 SOAP 正文的一部分发送。
例 8.2. 使用带有附件的 SOAP 的合同
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="XrayStorage"
targetNamespace="http://mediStor.org/x-rays"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="http://mediStor.org/x-rays"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<message name="storRequest">
<part name="patientName" type="xsd:string"/>
<part name="patientNumber" type="xsd:int"/>
<part name="xRay" type="xsd:base64Binary"/>
</message>
<message name="storResponse">
<part name="success" type="xsd:boolean"/>
</message>
<portType name="xRayStorage">
<operation name="store">
<input message="tns:storRequest" name="storRequest"/>
<output message="tns:storResponse" name="storResponse"/>
</operation>
</portType>
<binding name="xRayStorageBinding" type="tns:xRayStorage">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="store">
<soap:operation soapAction="" style="document"/>
<input name="storRequest">
<mime:multipartRelated>
<mime:part name="bodyPart">
<soap:body use="literal"/>
</mime:part>
<mime:part name="imageData">
<mime:content part="xRay" type="image/jpeg"/>
</mime:part>
</mime:multipartRelated>
</input>
<output name="storResponse">
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="xRayStorageService">
<port binding="tns:xRayStorageBinding" name="xRayStoragePort">
<soap:address location="http://localhost:9000"/>
</port>
</service>
</definitions>