連載:世界のWebサービス
|
XFSが提供するWebサービスはいたってシンプルなものだ。公開されているメソッドは、次の表に示すようにわずかに4つだけで、ディレクトリや細かなアクセス制御はサポートされていない(Windows 9x/Meのワークグループ共有フォルダのように、パスワードの使い分けによる簡単なアクセス制御は可能)。
ファイルの書き込み | |
void writeFile(String userid, String filedata, String filename, String password) | |
String userid | ユーザーID(登録したメール・アドレス) |
String filedata | 書き込むファイルの内容(Base64エンコード) |
String filename | ファイル名 |
String password | パスワード |
ファイルの読み出し | |
String readFile(String userid, String filename, String password) | |
戻り値 | 読み出したファイルの内容 |
String userid | ユーザーID(登録したメール・アドレス) |
String filename | ファイル名 |
String password | パスワード |
ファイルの削除 | |
String removeFile(String userid, String filename, String password) | |
戻り値 | 正常に終了すれば文字列「Success」が戻る |
String userid | ユーザーID(登録したメール・アドレス) |
String filename | ファイル名 |
String password | パスワード |
格納されたファイルの一覧を取得 | |
String listFiles(String userid, String password) | |
戻り値 | ファイル一覧(XML形式) |
String filename | ユーザーID(登録したメール・アドレス) |
String password | パスワード |
XFSが提供するWebサービスで公開されている4つのメソッド |
XFSストレージへデータとして書き込めるのはテキストだけで、さらにこのデータはBase64でエンコードされている必要がある。Base64とは、メールにバイナリ・ファイルを添付するときなどに使われるエンコード形式で、データはすべて英数字のみで表現される。このため、ファイルを保存するときにはBase64への変換を行い、読み出すときにはBase64から元の状態へ戻す処理を行う必要がある。
サンプル・プログラムXFSClient
今回作成したサンプル・プログラムのXFSClientも、XFSサービスに負けず劣らずシンプルなものだ。
今回作成したXFSClientプログラムの実行画面 | |||||||||||||||||||||
XFSClientは、XFSを利用するクライアント・アプリケーションである。XFSストレージに保存されたファイルの読み書きと削除が可能だ。 | |||||||||||||||||||||
|
ここで[保存]ボタンをクリックすると、テキストボックス(editBox)に入力されたテキストを指定したファイル名でXFSストレージに保存し、[開く]ボタンをクリックすると、指定したファイルをテキストボックス(editBox)に読み込む。また、[削除]ボタンをクリックすれば、指定のファイルを削除できる。なお、listFilesメソッドによるファイルの一覧表示機能は実装していないので、必要ならばXFSのasmxファイルをWebブラウザで開き、ここからメソッドを呼び出してほしい。すると、次のリストに示すようなXML形式でファイル一覧情報が1つの文字列として戻る。
|
|
listFilesメソッドの実行結果 |
機能的には非常にシンプルなXFSClientだが、その実装は単純にwriteFileメソッドやreadFileメソッドを呼び出すだけではない。前述したように、読み書きするファイルの内容はBase64でエンコードされていなければならないので、XFSストレージにファイルを保存するときには、テキストボックスに入力されたテキストをBase64でエンコードしなければならず、逆に読み出すときにはデコードしなければならないからだ。実はXFSClientの主要なコードは、ほとんどがこのBase64処理で占められていて、XFSサービスを呼び出すコードはほんの数行にすぎない。
それでは、コードの解説をしよう。Base64エンコードを行う保存処理と、Base64デコードを行う読み出し処理は非常によく似ているので、保存処理だけを解説することにする。
|
|
XFSストレージへの保存処理部分のリスト |
保存処理は以下の手順で行う。
- テキストボックスの文字列をbyteの配列に変換する。
- byteの配列をBase64形式にエンコードし、再度文字列に変換する。
- XFS.writeFileメソッドを呼び出し、XFSストレージに保存する。
■Base64エンコード(EncodeAsBase64クラス)
一連の処理のなかで最も手間がかかりそうに見えるのは、Base64形式へのエンコードだが、この処理は.NET Frameworkで定義されるSystem.Security.Cryptography.EncodeAsBase64クラスを使って実現できるため、プログラマはBase64の詳細について知る必要はない。
Base64処理がCryptography(暗号法)ネームスペースに含まれているのは不思議に思われるかもしれないが、.NET Frameworkでは、Base64エンコードは暗号化の一環として捉えられているようだ。なおこのネームスペースでは、Base64以外にも、DESやRC2、それにRSAといった暗号化アルゴリズムが定義されている。
■文字列→byte配列への変換(UnicodeEncoding、ASCIIEncodingクラス)
このEncodeAsBase64クラスを利用してBase64エンコードを行うには、入力文字列をbyte配列へと変換しなければならない。ところが.NETでは、文字とbyte型データは厳密に区別されているため、String型変数に格納されている文字列を単純にbyte型の配列に変換することはできない(char型の配列には変換可能)。そこで利用するのが、System.Text.UnicodeEncodingクラス(Unicodeとの変換)や、System.Text.ASCIIEncodingクラス(ASCIIとの変換)である。これらのクラスは、指定したエンコーディング方式(文字コード)で、String型データをbyte型配列へと変換することができる。
XFSClientでは、まずUnicodeEncodingクラスを用いて、byte型配列への変換を行っている。このとき、String型データは、もともとUnicodeで文字が表現されているため、エンコーディングは影響を受けず、単純にbyte型へと変換される。そしてBase64へのエンコードを行った後、再度byte型配列をString型へと変換する。Base64エンコードされたデータはASCIIコードで表されているため、今度はASCIIEncodingクラスを用いてString型データへの変換を行う。
なお、System.Textネームスペースで定義されているCodePageEncodingクラスを利用すれば、指定したコード・ページに対応するエンコーディングへの変換も可能だ。たとえば、コード・ページ932を指定すれば、Shift JISへ変換することができる。
■XFSサービスの呼び出し
そして最後にXFSサービスのWriteFileメソッドを呼び出し、リモート・ストレージへの書き込みを行う。このとき、ユーザーIDやパスワードが間違っていたり、1Mbytesの上限を超えていたりすると例外が発生するので、try〜catch構文で例外処理を行う。
XFSClientのコンパイル
XFSClientの全ソースコードは膨大なので、記事中には掲載しない。これについては、以下のリンクからファイルをダウンロードしていただきたい。
XFSClient.csのダウンロード
コンパイル用のバッチ・ファイルmake.batのダウンロード
XFSClientをコンパイルするには、XFSClient.csを格納したディレクトリで、コマンドプロンプトから以下の2つのコマンドを順に実行する(これらをバッチ・ファイルにしたものが上記のmake.batである)。正常にコンパイルされれば、カレント・ディレクトリにXFSClient.exeが生成される。
|
|
XFSClientプログラムのコンパイル |
なお、このサンプル・プログラムでは、リモート・ストレージへ書き込んだ文字列の合計バイト数が奇数の場合、それを読み込んで表示したときに最後の1文字が消えてしまう。これはおそらく、クラス・ライブラリにおけるBase64デコード処理のバグが原因と思われる。プログラムで回避することもできるが、サンプルということで、このプログラムではそのままにしてある。
モバイル・デバイスのWebサービス
現在リモート・ストレージ・サービスは、Webブラウザからアクセスするものが主流だが、これではわずかに縦横100〜200ドット程度の画面しか持たないPDAや携帯電話でブラウザを通してアクセスするのは不可能に近い。しかし、Webサービスとして実装されていれば、クライアント側に適切なユーザー・インターフェイスを実装することが可能になる。これはリモート・ストレージ・サービスに限らず、WWW上の数多くのサービスに当てはまることだ。
ただ、Webサービスを利用するためには、クライアント側にアプリケーションの実行環境が必要になる。そこでマイクロソフトは携帯電話向けにStinger(Windows CE 3.0ベースの携帯電話用OS)を開発しているわけだが、少なくとも国内では分の悪い戦いを強いられる可能性がある。すでにこの市場ではJava陣営が橋頭堡を築きつつあるからだ。
2〜3月に発売されたDoCoMoの携帯電話503iシリーズでは、「iアプリ」の名前でJavaアプリケーションが利用可能になっている。2001年3月の時点で、契約者数が2000万人を超えたと言われるiモード・ユーザーが、いずれiアプリ対応機種へと乗り換えてくるとすれば、膨大なユーザーがそれと知らずにJavaアプリケーションを利用するようになる。また、今年の夏にはJ-PhoneやauもJava実行環境を備える携帯電話を発売予定とされているし、PalmやZaurusにもJava実行環境が実装されている。携帯電話やPDAの世界では、ほとんどJava一色といってもいいだろう。
今のところモバイル・デバイス向けJava環境には、Webサービスに相当する機能は実装されていないが、いずれ携帯電話やPDAにSun ONE(Sun Open Net Environment)が搭載され、Webサービス相当の機能が組み込まれることは間違いない。このままいくと、PCクライアントに関して言えば、マイクロソフトがWindows XPを武器に.NETを広めていくだろうが、モバイル・クライアントではJava陣営が一歩先んずることになりそうだ。
関連リンク | |
Yahoo Briefcase | |
Xdrive | |
Office eServicesのページ | |
XMethodsのユーザー登録ページ
XFS Webサービスのテスト・ページ(asmxファイル) |
INDEX | ||
[連載]世界のWebサービス―― 究極のWebサービスを求めて ―― | ||
第3回 リモート・ストレージ・サービス | ||
1.サンプル・プログラムXFSClientの作成 | ||
「世界のWebサービス」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|