第 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/"

更改消息绑定

在默认的 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 多部分信息,您必须执行以下操作:

  1. 在您要作为 MIME 多部分消息发送的 输入或输出 消息中,添加一个 mime:mulipartRelated 元素作为括起消息的第一个子元素。
  2. mime:part 子元素添加到 mime:multipartRelated 元素,并将其 name 属性设置为唯一字符串。
  3. 添加 soap:body 元素作为 mime:part 元素的子项,并相应地设置其属性。

    注意

    如果合同具有默认的 SOAP 绑定,您可以将 soap:body 元素从默认绑定中的对应消息复制到 MIME 多部分消息。

  4. 将另一个 mime:part 子元素添加到 mime:multipartReleated 元素,并将其 name 属性设置为唯一字符串。
  5. mime:content 子元素添加到 mime:part 元素,以描述消息此部分的内容。

    要完全描述 MIME 消息部分的内容,mime:content 元素具有以下属性:

    表 8.1. MIME:content 属性
    属性描述 +

    部分

    指定来自父消息定义的 WSDL 消息部分的名称,该部分用作要在有线上的 MIME 多部分消息的内容。

    +

    type

    此消息部分中的数据的 MIME 类型部分。MIME 类型定义为类型和子类型,使用语法类型/子类型

    +

    有很多预定义的 MIME 类型,如 image/jpegtext/plain。MIME 类型由互联网编号分配机构(IANA)维护,并在 多用途互联网邮件扩展(MIME)中详细介绍:互联网消息 BodiesMultipurpose Internet 邮件扩展(MIME)第 2 部分

    +

  6. 对于每个额外的 MIME 部分,重复步骤 [i303819][i303821]

示例

例 8.2 “使用带有附件的 SOAP 的合同” 显示一个 WSDL 片段,用于定义以 JPEG 格式存储 X-rays 的服务。镜像数据 xRay 存储为 xsd:base64binary,并打包成 MIME 多部分 imageData。输入消息的剩余两个部分是 patientNamepatientNumber,作为 SOAP 正文的一部分在 MIME 多部分镜像的第一个部分中发送。

例 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>
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.