SOAP Message Transmission Optimization Mechanism (MTOM) は、World Wide Web Consortium (W3C) により作成された標準です。MTOM は、XML 情報セット (Infoset) を SOAP アプリケーションに表示しながら、選択的にメッセージの一部を再コード化することにより、SOAP メッセージの伝送やワイヤー・フォーマットを最適化するメカニズムを記述します。
XOP は、SOAP および MIME パッケージングにのみ適用されるのではなく、すべての XML Infoset とすべてのパッケージング・メカニズムに適用される、バイナリー・コンテンツを持つ XML Infoset のシリアライゼーション・メカニズムを定義します。これは、XML 文書がルート・パーツにあたる、MIME multipart/related パッケージに偶然似ている、XML の代替シリアライゼーションです。このルート・パーツは文書の XML シリアライゼーションにたいへんよく似ていますが、base64 でエンコードされたデータが、base64 でエンコードされていない MIME パーツの 1 つへの参照で置き換えられる点が異なります。この参照によって、ユーザーはエンコードに関連するバルク処理および処理のオーバーヘッドを回避することができます。 エンコードは、バイナリー・データが XML の世界に直接適合できる、唯一の方法です。
MTOM マッピング生成が無効な場合、XOP は使用できません。XOP が使用不可の場合、バイナリー・データは MIME 添付ファイルを使用して送信されません。代わりに、バイナリー・データは通常のように base64 でエンコードされます。
これらの抽象機能の実装には 2 つの側面での具体的仕様が必要です。それは、最適化されたワイヤー・フォーマットと、特定のトランスポートでの最適化されたワイヤー・フォーマットの流れ方です。
Java API for XML Web Services (JAX-WS) は、MTOM を使用したバイナリー・データ添付ファイル送信のサポートを追加しています。 JAX-WS は、JAX-WS 2.0、JAXB 2.0、および SAAJ 1.3 を含む、新たに再体系化された Web サービス用 API スタックの心臓部です。 API スタックは統合スタックと呼ばれることもあります。JAX-WS は、Web サービスおよび Web アプリケーションにおける JAX-RPC に取って代わるように設計されています。
これとは別の標準が World Wide Web Consortium (W3C) により定義されており、こちらは SOAP with Attachments (SwA) と呼ばれます。SwA は、添付ファイルを持つ SOAP メッセージをパッケージ化する方法として開発されました。 一部のベンダーでは SwA をサポートしていないため、SwA をより強力な MTOM および XOP メカニズムと置き換えることができます。SwA と MTOM は概念的に似ており、どちらもバイナリー・データを MIME 文書の MIME 添付ファイルとしてエンコードします。 MIME 添付ファイルを使用することにより、大きなバイナリー・ペイロード・トランスポートのパフォーマンスが向上します。
SOAP 1.1 は XML 仕様に基づいています。恐らく SOAP 1.1 実装は今後数年間存在し続けます。まだ SOAP 1.1 を使用しているユーザーのために、添付ファイルのサポート用に MTOM を使用する相互運用可能な方法が用意されています。 SAP、Oracle、Microsoft、および IBM は、SOAP 1.1 ペイロードで MTOM を使用できる方法を定義する、SOAP 1.1 Binding for MTOM 1.0 仕様を W3C に提出しました。この仕様は、SOAP 1.1 で MTOM および XOP 技術をうまく利用するために必要な、SOAP MTOM および XOP 仕様への変更を詳しく定めています。詳しくは、次の Web サイトを参照してください。http://schemas.xmlsoap.org/soap/mtom/SOAP11MTOM10.pdf
MTOM は SOAP バージョン 1.2 の機能で、Infoset に基づいています。詳しくは、XML 情報セット を参照してください。
MTOM がなければ、データはスキーマ (base64 または 16 進) で記述されているフォーマットのいずれかでエンコードされ、XML 文書で表示されます。次の例は <xsd:base64Binary> エレメントを持つ SOAP メッセージを示します。
... other transport headers ... Content-Type: text/xml; charset=UTF-8 <?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header/> <soapenv:Body> <sendImage xmlns="http://org/apache/axis2/jaxws/sample/mtom"> <input> <imageData>R0lGODl ... more base64 encoded data ... KTJk8giAAA7</imageData> </input> </sendImage> </soapenv:Body> </soapenv:Envelope>
MTOM が使用可能になっている場合、添付ファイルを表すバイナリー・データは SOAP メッセージの MIME 添付ファイルとして含まれています。以下の例は、添付ファイル・データを持つ、MTOM を使用可能にした SOAP メッセージを示します。
... other transport headers ... Content-Type: multipart/related; boundary=MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812; type="application/xop+xml"; start="<0.urn:uuid:0FE43E4D025F0BF3DC11582467646813@apache.org>"; start-info="text/xml"; charset=UTF-8 --MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812 content-type: application/xop+xml; charset=UTF-8; type="text/xml"; content-transfer-encoding: binary content-id: <0.urn:uuid:0FE43E4D025F0BF3DC11582467646813@apache.org> <?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header/> <soapenv:Body> <sendImage xmlns="http://org/apache/axis2/jaxws/sample/mtom"> <input> <imageData> <xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:1.urn:uuid:0FE43E4D025F0BF3DC11582467646811@apache.org"/> </imageData> </input> </sendImage> </soapenv:Body> </soapenv:Envelope> --MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812 content-type: text/plain content-transfer-encoding: binary content-id: <1.urn:uuid:0FE43E4D025F0BF3DC11582467646811@apache.org> ... binary data goes here ... --MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812--