Menu Close

第8章 添付ファイル付き SOAP を使用したバイナリーデータの送信

概要

SOAP 添付ファイルは、SOAP メッセージの一部としてバイナリーデータを送信するメカニズムを提供します。添付ファイル付き SOAP を使用するには、SOAP メッセージを MIME マルチパートメッセージとして定義する必要があります。

概要

通常、SOAP メッセージにはバイナリーデータは含まれません。ただし、W3C SOAP 1.1 仕様では、MIME multipart/related メッセージを使用して SOAP メッセージのバイナリーデータを送信できます。この手法は、添付ファイル付き SOAP を使用して呼び出されます。SOAP 添付ファイルは、W3C の「SOAP Messages with Attachments Note」で定義されています。

namespace

MIME multipart/related メッセージの定義に使用される WSDL エクステンションは、namespace http://schemas.xmlsoap.org/wsdl/mime/ で定義されます。

以下の説明では、この namespace の前に mime プレフィックスが付くことを仮定しています。これを設定する WSDL definitions 要素のエントリーは 例8.1「コントラクトの MIME namespace 仕様」 にあります。

例8.1 コントラクトの MIME namespace 仕様

xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"

メッセージバインディングの変更

デフォルトの SOAP バインディングでは、inputoutput、および fault 要素の最初の子要素は、データを表す SOAP メッセージのボディーを記述する soap:body 要素です。添付ファイル付き SOAP を使用する場合、soap:body 要素は mime:multipartRelated 要素に置き換えられます。

注記

WSDL は、fault メッセージへの mime:multipartRelated の使用をサポートしません。

mime:multipartRelated 要素は、メッセージボディーがバイナリーデータが含まれる可能性のあるマルチパートメッセージであることを Apache CXF に伝えます。要素の内容は、メッセージの一部とその内容を定義します。mime:multipartRelated 要素には、メッセージの個別部分を記述する 1 つ以上の mime:part 要素が含まれます。

最初の mime:part 要素には、通常デフォルトの SOAP バインディングに存在する soap:body 要素が含まれている必要があります。残りの mime:part 要素は、メッセージで送信される添付ファイルを定義します。

MIME マルチパートメッセージの記述

MIME マルチパートメッセージは、複数の mime:part 要素が含まれる mime:multipartRelated 要素を使用して記述されます。MIME マルチパートメッセージを完全に説明するには、以下を行う必要があります。

  1. MIME マルチパートメッセージとして送信する input または output メッセージで、エンクロージングメッセージの最初の子要素として 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 属性

    属性説明

    part

    ネットワーク上の MIME マルチパートメッセージの内容として使用される、親メッセージ定義から WSDL メッセージ part の名前を指定します。

    +

    type

    このメッセージ部分のデータの MIME タイプ。MIME タイプは構文 type/subtype を使用してタイプまたはサブタイプとして定義されます。

    +

    image/jpeg および text/plain といった事前定義された MIME タイプは複数あります。MIME 型は、Internet Assigned Numbers Authority (IANA) で維持され、『Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies』および『Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types』に詳しく説明されています。

    +

  6. 追加の MIME 部分ごとに、ステップ [i303819] および [i303821] を繰り返します。

例8.2「添付ファイル付き SOAP を使用したコントラクト」 は、レントゲンを JPEG 形式で保存するサービスを定義する WSDL フラグメントを示しています。イメージデータ xRayxsd:base64binary として保存され、MIME マルチパートメッセージの 2 番目の部分 imageData にパッケージ化されます。入力メッセージの残り 2 つの部分であるpatientName および patientNumber は、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>