Red Hat Training
A Red Hat training course is available for Red Hat Fuse
第8章 添付ファイル付きの SOAP を使用したバイナリーデータの送信
概要
SOAP 添付ファイルは、SOAP メッセージの一部としてバイナリーデータを送信するためのメカニズムを提供します。添付ファイルで SOAP を使用するには、SOAP メッセージを MIME マルチパートメッセージとして定義する必要があります。
概要
通常、SOAP メッセージはバイナリーデータを伝送しません。ただし、W3C SOAP 1.1 仕様では、MIME マルチパート/関連メッセージを使用して SOAP メッセージでバイナリーデータを送信できます。この手法は、添付ファイル付きの SOAP を使用して呼び出されます。SOAP 添付ファイルは、W3C の SOAP Messages with Attachments Note で定義されています。
Namespace
MIME マルチパート/関連メッセージの定義に使用される WSDL 拡張機能は、名前空間 http://schemas.xmlsoap.org/wsdl/mime/ で定義されています。
以下の説明では、この namespace の前に mime 接頭辞が付くことを仮定しています。これを設定する WSDL definitions 要素のエントリーは 例8.1「コントラクトの MIME 名前空間の仕様」 に表示されます。
例8.1 コントラクトの MIME 名前空間の仕様
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
メッセージバインディングの変更
デフォルトの SOAP バインディングでは、input、output、および 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 マルチパートメッセージを完全に説明するには、次の手順を実行する必要があります。
-
MIME マルチパートメッセージとして送信する
inputまたはoutputメッセージで、エンクロージングメッセージの最初の子要素として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属性属性 説明 親メッセージ定義から、ネットワーク上の MIME マルチパートメッセージのこの部分の内容として使用される WSDL メッセージ
partの名前を指定します。+
このメッセージ部分のデータの MIME タイプ。MIME タイプは構文 type
/subtype を使用してタイプまたはサブタイプとして定義されます。+
image/jpegおよびtext/plainといった事前定義された MIME タイプは複数あります。MIME タイプは、Internet Assigned Numbers Authority (IANA) によって維持され、Multipurpose Internet Mail Extensions (MIME) パート 1: インターネットメッセージ本文 と Multipurpose Internet Mail Extensions (MIME) パート 2: メディアタイプ で詳細に説明されています。+
- 追加の MIME 部分ごとに、手順 [i303819] および [i303821] を繰り返します。
例
例8.2「添付ファイル付きの SOAP を使用したコントラクト」 は、X 線を JPEG 形式で保存するサービスを定義する WSDL フラグメントを示しています。イメージデータ xRay は、xsd: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>