Webサービスにおいて、バイナリーデータを送信したい場合、以下3つの方法がよく利用されています。
- Base64:バイナリーデータをBase64エンコードする。
- SwA:SOAP with Attachments(添付ファイルを利用する)
- MTOM/XOP:Message Transmission Optimization Mechanism (ビット・ストリーム伝送を最適化する)
#Base64
バイナリーデータをBase64エンコードすることで、画像等のバイナリーデータを文字列として送信できます。Base64の欠点は、元のデータサイズより更に1.3倍増加し、データサイズが大きい場合、メッセージの転送時間が長く、エンコード・デコード処理にオーバーヘッドが発生する。
以下はBase64を利用する場合、SOAPメッセージの例です。
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
<S:Body>
<ProductInput xmlns="product.test.co.jp:schema">
<ProductInfo>
<ProductID>PDT001</ProductID>
<ProductName>IPhone SE</ProductName>
<Price>10000</Price>
<Image>VGhpcyBpcyB*****Here is a image with very very big size.*****FnZS4=</Image>
</ProductInfo>
</ProductInput>
</S:Body>
</S:Envelope>
#SwA
Base64の欠点を解決するために、SwAの登場です。
SwA(SOAP with Attachments)は、MIMEコンテンツ・タイプを使用し、バイナリーデータを添付として SOAP エンベロープの外に置きます。SwAの問題は、添付ファイルはXML(SOAPエンベロープ)の部分と無関係であり、XMLパーサーに通らない点です。
以下はSWAを利用する場合、SOAPメッセージの例です。
--uuid:e26aa9af-605d-45db-bdfb-f82c06dcce01
Content-Type:application/soap+xml; charset=utf-8
<?xml version="1.0" ?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header></env:Header>
<env:Body>
<ProductInput xmlns="product.test.co.jp:schema">
<ProductInfo>
<ProductID>PDT001</ProductID>
<ProductName>IPhone SE</ProductName>
<Price>10000</Price>
<Image></Image>
</ProductInfo>
</ProductInput>
</env:Body>
</env:Envelope>
--uuid:e26aa9af-605d-45db-bdfb-f82c06dcce01
Content-Id:<6bfec2dc-4cc5-4528-b431-b3fba55d2ab8>
Content-Type:image/jpeg
Content-Transfer-Encoding: binary
*****Here is a image with very very big size.*****
--uuid:e26aa9af-605d-45db-bdfb-f82c06dcce01--
#MTOM
MTOM は SOAP 1.2 仕様の一部で、SwAと非常に似っていますが、唯一異なる点としては、SOAPエンベロープ内のSOAPボディからMTOM/XOP仕様形式の添付を参照する方法は,XOP要素のhref属性が使用されることです。Base64に比べて、バイナリーデータの占有スペースが小さくて済むので、MTOM を使用するとプロセッサー使用量が増えることはありますが、伝送時間を短くできます。
以下はMTOM/XOPを利用する場合、SOAPメッセージの例です。
--uuid:d8c9f386-9762-4b9f-8edc-1c605beae853
Content-Id:<rootpart*d8c9f386-9762-4b9f-8edc-1c605beae853@example.jaxws.sun.com>
Content-Type:application/xop+xml;charset=utf-8;type="application/soap+xml;action=\"\""
Content-Transfer-Encoding: binary
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
<S:Body>
<ProductInput xmlns="product.test.co.jp:schema">
<ProductInfo>
<ProductID>PDT001</ProductID>
<ProductName>IPhone SE</ProductName>
<Price>10000</Price>
<Image xmlns:xop="http://www.w3.org/2004/08/xop/include">
<xop:Include
href="cid:fd72e747-1f04-49e2-af6d-c4b35b3e50d2@example.jaxws.sun.com"></xop:Include>
</Image>
</ProductInfo>
</ProductInput>
</S:Body>
</S:Envelope>
--uuid:d8c9f386-9762-4b9f-8edc-1c605beae853
Content-Id:<fd72e747-1f04-49e2-af6d-c4b35b3e50d2@example.jaxws.sun.com>
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
*****Here is a image with very very big size.*****
--uuid:d8c9f386-9762-4b9f-8edc-1c605beae853--