この方法では、SOAP メッセージに対するアタッチメントとして XML ビジネスドキュメントを記述します。SOAP の SwA (Messages with Attachments) では、MIME Multipart/Related パッケージを使用し、XML メッセージとともにバイナリデータやその他アタッチメントを送信する方法を定義しています。実際には、1 つの SOAP メッセージには、 MIME エンコーディングを使用して 1 つ以上のアタッチメントを含むことができ、このため、しばしば複合メッセージと呼ばれます。SOAP メッセージ本体ではなく、アタッチメントで情報を送信するのは、かなり効率的です。SOAP メッセージの本体が小さいほどその処理に要する時間が短くなり、メッセージにデータそのものが含まれるのではなく、データに対する参照が含まれるだけであるため、データを Java オブジェクトにマッピングする際の変換時間が短縮されます。
JAX-RPC は、SOAP アタッチメントの処理に JavaBeans[tm] アクティべーションフレームワークを使用します。このメッセージを Java にアンマーシャリングする際、JAX-RPC 実行時環境では、2 つのマッピング手法を利用できます。
DataHandlers
および DataContentHandlers
を使用して、表 1 に示すように、既知の種類の MIME を Java オブジェクトに、その逆に Java オブジェクトを既知の種類の MIME にマッピングする。javax.activation.DataHandler
に、その逆に javax.activation.DataHandler
をアタッチメントにマッピングする。 単純な意味では、このことはサービスエンドポイント内のメソッドが表 1 に示すような標準のデータ型を使用している場合、実行時環境は、SOAP メッセージ内の 1 つの MIME アタッチメントとしてその型をマッピングします。javax.activation.DataHandler
を使用している場合は、DataHandler
で getContent()
を使用することによって、そのアタッチメントの内容を抽出することができます。インストールされている DataContentHandler
が内容の種類を理解しない場合は、raw バイトを付きで java.io.InputStream
オブジェクトが返されます。
MIME |
型 |
image/gif |
java.awt.Image |
image/jpeg |
java.awt.Image |
text/plain |
java.lang.String |
multipart/* |
javax.mail.internet.MimeMultipart |
text/xml or application/xml |
javax.xml.transform.Source |
表 1: MIME の種類と Java データ型のマッピング
アタッチメントでの問題点の 1 つは、WSDL でアタッチメントを指定する標準の方法がないことです。かっては、SOAP Envelope の外部にある MIME パッケージの使用についても、ベンダー間の合意がありませんでした。これは、WS-I Attachment Profile 1.0 である程度解消されていて、現在は、アタッチメント処理に関する相互運用要件が定義され、J2EE 1.4 SDK (および JWSDP 1.4) で完全にサポートされています。MIME バインドを使用し WSDL から始めると、相互運用可能で WS-I に準拠したアタッチメントベースのサービスを構築することができます。WS-I Attachment Profile 1.0 にはまた、WSDL に定義されていないアタッチメントの処理に使用できるアタッチメントの種類を参照する新しい型、"swaRef" も定義されています。
ここでの例では、自身にアタッチメントとして送られてきた XML ドキュメントを受信できるサービスを説明します。コード例 1 の WSDL 抜粋は、MIME バインドの内容を示しています。
<types>
<schema
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:wsi="http://ws-i.org/profiles/basic/1.1/xsd"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
targetNamespace="urn:AttachmentPurchaseOrderService">
<import
namespace="http://ws-i.org/profiles/basic/1.1/xsd"
schemaLocation="WS-ISwA.xsd"/>
<element name="statusmessage"
type="wsi:swaRef"/>
<element name="InvalidPOException"
type="string"/>
</schema>
</types>
...
<message
name="AttachmentPurchaseOrderServiceSEI_submitPO">
<part
name="attachment_1" type="xsd:hexBinary"/>
</message>
<message
name="AttachmentPurchaseOrderServiceSEI_submitPOResponse">
<part name="response"
element="ns1:statusmessage"/>
</message>
<message name="InvalidPOException">
<part
name="InvalidPOException" element="ns1:InvalidPOException"/>
</message>
...
<portType
name="AttachmentPurchaseOrderServiceSEI">
<operation name="submitPO">
<input
message="tns:AttachmentPurchaseOrderServiceSEI_submitPO"/>
<output
message="tns:AttachmentPurchaseOrderServiceSEI_submitPOResponse"/>
<fault name="InvalidPOException"
message="tns:InvalidPOException"/>
</operation>
</portType>
<binding
name="AttachmentPurchaseOrderServiceSEIBinding"
type="tns:AttachmentPurchaseOrderServiceSEI">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="submitPO">
<input>
<mime:multipartRelated>
<mime:part>
<soap:body
use="literal"/>
</mime:part>
<mime:part>
<mime:content part="attachment_1" type="text/xml"/>
</mime:part>
</mime:multipartRelated>
</input>
<output>
<mime:multipartRelated>
<mime:part>
<soap:body
parts="response" use="literal"/>
</mime:part>
</mime:multipartRelated>
</output>
<fault name="InvalidPOException">
<soap:fault name="InvalidPOException"
use="literal"/>
</fault>
</operation>
</binding>
public interface
AttachmentPurchaseOrderServiceSEI extends Remote {
public URI submitPO(Source attachment_1) throws
InvalidPOException,
RemoteException;
}
コード例 2: サービスエンドポイントインタフェース
アタッチメントを使用するこの方法の欠点のいくつかは、相互運用性が犠牲になる可能性があることです。すべてのツールキットは、Attachment Profile 1.0 をサポートしているわけではありません。Attachment Profile 1.0 は WS-I Basic Profile 1.0 には含まれていませんが、将来、Basic Profile に含まれる予定です。実際問題として、現状、.NET プラットフォームでは、MIME アタッチメントのサポートはありません。このため、C# クライアントが消費する必要がある Web サービスをデザインする場合、今のところ、アタッチメントを使用することは、XML ドキュメントをやりとりする優れた選択肢ではありません。