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