10
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Webサービスでバイナリーデータの送信

Last updated at Posted at 2016-05-06

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--
10
11
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?