matsukaz's blog

Agile, node.js, ruby, AWS, cocos2d-xなどなどいろいろやってます

Webサービスにおけるファイルの添付

こないだユーザ先の子が、Webサービスでファイルの添付をしようとして苦労してたんで、そのときの話でも。

Webサービスのスタイルとしては、相互運用性を考えてdocument/literal wrappedパターンでいこうって話をしてたんだけど、それだとどうもファイルの添付がうまくいかないらしく。調べてみたら、Web サービス・プログラミングのヒントと秘訣: WS-I の wsi:swaRef XML タイプを使用したアタッチメントって記事が。まさしくこれですな(汗)
内容を引用すると、

3 番目の問題は、アタッチメントが、WSDL の document/literal wrapped パターンに対する現在の業界の傾向とうまくフィットしないというものです。
(中略)
問題は、document/literal wrapped パターンでは、メッセージ内に 1 つのパートしか可能ではなく、そのパートがラッパー・エレメントを参照していなければならないことです。アタッチメント・パートをこのモデルにフィットさせる方法はあるのでしょうか。 それはありません。 1 つのメッセージ内に入れられる定義を緩和すればフィットさせることができますが、この緩和を公式化することを試みた人はだれもいません。

要は、document/literal wrappedパターンを採用するとパートは1つになるけど、ファイルを添付するにはパートが複数になってしまう、と。この記事によると、WS-Iではwsi:swaRefを使えと言ってるんだそうな。でも問題点も以下のように挙げていて。

しかし、著者の意見としては、これはあまりに単純すぎます。 標準のアタッチメントと違って、アタッチメントの MIME タイプがわかりません。わかっているのは、アタッチメントが 1 つあるということだけです。 例えば MIME タイプを提供する属性を持った wsi:swaRef が WS-I に定義されていれば便利ですが、WS-I は、仕様を定義する任務を持っておらず、それらの仕様を明確にするだけです。そのため、WS-I は、実際に新しいものを定義するときには、それを最小にしておくことを好みます。

他にもDIMEを使う方法もあるみたい・・・だけど、どれも相互運用性に不安がありそう。そもそもWebサービスでファイルの添付を、っていう要件はあんまりないと思うんだけど、いざ使うことになったらどうしようか迷いそうだ・・・。