XML-binary Optimized Packaging (XOP) 仕様は、2005 年 1 月 25 日に World Wide Web (W3C) により標準化されました。SOAP Message Transmission Optimization Mechanism (MTOM) では、XOP を、HTTP を介した SOAP および MIME のコンテキストで使用しています。
XML はデータ転送で広く使用されています。XML は平文で人間が読め、また、構造化されているので、正しい形式の文書の交換によく使用されるフォーマットです。 例えば、Web サービスにおける SOAP メッセージングは XML (または、SOAP 1.2 では XML Infoset) に基づいています。ユーザーは XML モデルを使用しながらも、PDF や GIF、JPEG などの既存のフォーマットを活用したいと考えます。XML を既存のデータ・フォーマットと統合することは、XML コミュニティーでの長年の課題でした。ユーザーはたいてい、XML 1.0 構文にはすぐに合わない既存のデータ・フォーマットを諦めることなく、構造化された拡張可能な XML のマークアップ構文規則を活用したいと考えます。
Web サービスにおいて SOAP メッセージングが広まるにつれ、メッセージと一緒に画像やワークフロー・データなどのテキスト・ベース以外のデータを送信する方法が、次の課題になりました。 例えば、2 つのアプリケーション間で、スキャンした文書を .jpeg 形式で送信する場合などです。問題は、さまざまなアプリケーション間で、このデータが認識されるかどうかです。
XML および Web サービスの価値の多くは、コンテンツを操作するための汎用 XML ツールを使用できる機能にあります。XML を記述し、操作するための多くの XML ツールおよび標準 (構文解析プログラム、XPath、XQuery、XSLT、XML 暗号化、およびデジタル・シグニチャーおよび XML スキーマなど) は、画像などのテキスト・データ以外のデータを操作するように設計されていません。 これらの XML ツールは非 XML コンテンツは操作しません。これらのツールにはテキストが必要です。 問題は、非テキスト・データ (バイナリー・データ とも呼ばれます) を XML に組み込む、または添付する方法です。言い換えれば、SOAP メッセージにバイナリー・ファイルを添付する方法が必要です。
エンコードは、バイナリー・データを XML の世界に直接組み込むことができる、唯一の方法です。通常、Base 64 を使用してバイナリー・データをテキストとしてエンコードすることにより、XML 文書にバイナリー・データを組み込むことができます。 Base 64 は、そのままで簡単に実装でき、複数のプラットフォーム間での相互運用性がある、一時期存在していたシリアライゼーションです。 xsi:base64binary データ型は、XML スキーマでこのシリアライゼーションをサポートしています。 Base 64 はバイナリー・データを、XML 文書に入れ込むことができるテキスト表記にエンコードします。 Base 64 はバイナリー・データを取得して、1 回に 3 オクテットをエンコードすることにより、そのバイナリー・データを一連の ASCII 文字に変換します。 各オクテットは、ASCII 標準の印刷可能な 4 文字として表現される 8 ビットで構成されているため、バイナリーを表記するために 64 の ASCII 文字を使用します。 すべてのプラットフォームは、この規則を使用してデコードおよびエンコードできます。 6 ビット ASCII は広くサポートされており、特殊文字を処理する必要はありません。 ただし、大きなメッセージの場合はパフォーマンスに影響があります。
迅速な操作が必要なアプリケーションでは Base 64 はソリューションになりません。 そのようなコンテンツを索引付け、照会、変換、暗号化、署名、または記述したい場合は、別の手段を使用する必要があります。
そこで、SOAP with Attachments (SwA) と呼ばれる最初の添付仕様が開発されました。 SwA の基本的な概念は、バイナリー・メッセージの部分 (添付ファイル) を Multipurpose Internet Mail Extensions (MIME) 添付ファイルと考えることです。MIME は、非 ASCII メール・メッセージ添付ファイルのフォーマット設定を行うための、広く実装されている仕様です。 SwA は、単純に URI を使用することにより、SOAP 本体に MIME メッセージ部分 (添付ファイル) への参照を含めることができると指定します。 バイナリー部分は参照により添付されます。
たいてい、ユーザーは既存の非 XML フォーマットをそのままにしておき、XML ツールおよびインフラストラクチャーによって不透明なオクテットのシーケンスとして扱いたいと考えます。こうした方法は、.jpeg および .wav などの広く使用されているフォーマットで許容されており、XML と平和的に共存しています。 XOP は base64 でエンコードしたデータの使用を少し現実的にしています。 現在、XOP は base64 でエンコードしたデータしか最適化しません。
XOP を使用するということは、XML 型の base64Binary のインスタンスは、使用可能にした場合に MIME 添付ファイルを使用して転送されることを意味します。XOP が使用されている場合は、実装が自動的にこれをエンコードします。 添付ファイルは Base64 でエンコードしたデータとして扱われるため、XOP は XML メッセージのデータ・モデルを維持します。 XML スタックが XOP エンコードを認識すれば、アプリケーションを変更する必要は全くありません。 例えば、.jpeg 画像にアクセスしようとする場合、そのコンテンツの文字の値を base64 でエンコードしたストリングとして取得できます。
XOP は、ユーザーが使い慣れ、他の多くのデータにすでに使用しているデータ交換における、MIME メッセージについての考え方を示します。 XOP 形式では複数パーツ MIME を使用して、base64 エンコードへの再ソートせずに未加工のバイナリー・データを XML 1.0 文書に含めることができるようにしています。
付随仕様である SOAP Message Transmission Optimization Method (MTOM) は、次にこのフォーマットを SOAP にバインドする方法を指定します。XOP および MTOM 標準は SOAP 1.2 のパフォーマンスを向上させます。XOP および MTOM を一緒に使用することにより、バイナリー・データをテキスト・ベースの XML と一緒に使用するための優先的な方法が提供されます。 MTOM と XOP を組み合わせると、Infoset を維持しながら、メッセージのどの部分をワイヤーを介してバイナリーとして送信する必要があるかを選択できます。これにより、SOAP エンベロープの外にあるバイナリー・データをメッセージ部分として添付することが可能になります。ただし、SwA とは異なり、バイナリー・データはあたかも SOAP エンベロープ内にあるかのように、つまり 1 つの Infoset として処理されます。
XOP は、バイナリー・コンテンツを持つ XML Infoset 用のシリアライゼーションの仕組み (SOAP および MIME パッケージングだけではなく、すべての XML Infoset およびすべてのパッケージング・メカニズムに当てはまるもの) を定義します。 一方、XML は汎用パッケージング・メカニズムとしては優れていません。
XOP パッケージは、拡張可能なパッケージング形式 (MIME など) 内に XML Infoset のシリアライゼーションを置くことにより、作成されます。XOP は、ワイヤーでの実際のパッケージング用に MIME を再利用しますので気をつけてください。 次に、base64 でエンコードされたバイナリー・データのコンテンツの選択した部分が抽出され、再エンコードされます。つまり、データは base64 からデコードされ、パッケージに置かれます。 これらの選択した部分のロケーションは、URI を使用してパッケージ済みデータにリンクした特別のエレメントで XML 内でマーク付けされます。
SOAP 処理エンジンは、メッセージがワイヤーをヒットする直前に、バイナリー・データの一時的な Base 64 エンコードを実行します。 この一時的なエンコードにより、SOAP プロセッサーは Base 64 データを処理することができます。例えば、データの WS-Signature を取得して、それをヘッダーに置くことができます。もう一方の端での高価なデコードが必要なく、処理は逆に行われます。
MTOM および XOP の実装は Java (JAX-WS) で使用可能です。
<soap:Envelope xmlns:soap='http://www.w3.org/2003/05/soap-envelope' xmlns:xmlmime='http://www.w3.org/2004/11/xmlmime'> <soap:Body> <m:data xmlns:m='http://example.org/stuff'> <m:photo xmlmime:contentType='image/png'>/aWKKapGGyQ=</m:photo> <m:sig xmlmime:contentType='application/pkcs7-signature'>Faa7vROi2VQ=</m:sig> </m:data> </soap:Body> </soap:Envelope>
MIME-Version: 1.0 Content-Type: Multipart/Related;boundary=MIME_boundary; type="application/xop+xml"; start="<mymessage.xml@example.org>"; startinfo="application/soap+xml; action=¥"ProcessData¥"" Content-Description: A SOAP message with my pic and sig in it --MIME_boundary Content-Type: application/xop+xml; charset=UTF-8; type="application/soap+xml; action=¥"ProcessData¥"" Content-Transfer-Encoding: 8bit Content-ID: <mymessage.xml@example.org> <soap:Envelope xmlns:soap='http://www.w3.org/2003/05/soap-envelope' xmlns:xmlmime='http://www.w3.org/2004/11/xmlmime'> <soap:Body> <m:data xmlns:m='http://example.org/stuff'> <m:photo xmlmime:contentType='image/png'><xop:Include xmlns:xop='http://www.w3.org/2004/08/xop/include' href='cid:http://example.org/me.png'/></m:photo> <m:sig xmlmime:contentType='application/pkcs7-signature'><xop:Include xmlns:xop='http://www.w3.org/2004/08/xop/include' href='cid:http://example.org/my.hsh'/></m:sig> </m:data> </soap:Body> </soap:Envelope> --MIME_boundary Content-Type: image/png Content-Transfer-Encoding: binary Content-ID: <http://example.org/me.png> // binary octets for png --MIME_boundary Content-Type: application/pkcs7-signature Content-Transfer-Encoding: binary Content-ID: <http://example.org/my.hsh> // binary octets for signature --MIME_boundary--