« reCAPTCHAのススメ | メイン | JiftyでWebアプリをつくる - ログイン機能を作る »

Javaによるサーバサイドマッシュアップはてなブックマークに追加 livedoorクリップに追加 Yahoo!ブックマークに追加 del.icio.usに追加 イザ!ブックマーク ニフティクリップに追加

前回までに、Strutsアプリケーションの一部機能がAjax対応になりました。ビジネスロジックがJavaBeansになっていることで、それが持つ処理の再利用が実現でき、さらにDWRを使うことによって、Webブラウザ上からJavaScriptでのサーバサイドの処理を比較的簡単に利用することができました。多くのStrutsで作られたシステムは、このようにAjax対応を進めていくことができますので、積極的にAjaxに対応して、よりリッチな操作感を利用者に提供していきましょう。

さて今回からは、Javaでのマッシュアップに関する話をしていきたいと思います。元々Javaは「ネットワークに強い」という特徴がありますので、インターネット上に存在するどんなWebサービスでも、マッシュアップを行って自分のサービスに統合することが可能です。他の言語と違い、Javaの世界は、無数のOSSが次々と登場しています。それらをうまく活用することで、よりマッシュアップが手軽なものになります。

題材としている「イベント検索アプリケーション」も、マッシュアップを行って、扱う情報を充実させていきたいと思います。単にイベント情報だけが提供されるのでは、面白くありません。例えば、

  • 開催場所の近くにどんな居酒屋があるか
  • イベントの内容に関連した書籍を探したい
  • 参加した人のブログを見てみたい

など、イベントを取り巻く情報は数知れず考えられます。これらも提供してくれるイベント検索アプリケーションであれば、とても魅力的なサービスに見えることでしょう。

マッシュアップの形態

Javascriptからサーバを呼び出すには、図1にあるようにJavascriptからXMLHttpRequestを使ってサーバの処理を呼び出します。他のWebサービスをマッシュアップをする場合、XMLHttpRequestでは、図1の×印で示されているように、ドメインを超えてアクセスすることを禁止する「クロスドメインの制約」が存在しているため、直接JavascriptからWebサービスのサービスを呼ぶことが出来ません。


figure1.gif

図1 通常のサーバ呼び出し


そこで、クロスドメイン制約を超えてJavascriptからWebサービスのサービスを呼び出すために、いくつかの方法が考えられます。

ひとつは、自サーバを他のサービスのプロキシとして利用する方法です(図2)。Javascriptからは、自サーバにXMLHttpRequestでリクエストを行い、自サーバからマッシュアップ先のWebサービスのサービスを呼び出し、その結果をそのままWebブラウザに返してマッシュアップを行います。この方法では、サーバ側では通信を行うだけで済みますが、Webサービスのサービスから返されるXMLやJSONなどをJavascriptで解釈する必要があります。Javascriptが得意でない開発者にとっては、難しいパターンと言えるでしょう。


figure2.gif

図2 自サーバをプロキシとする


次の方法は、JSONPと呼ばれる方法です(図3)。マッシュアップをしたいWebサービスがJSONPに対応している場合に利用することができます。HTMLのscriptタグは、XMLHttpRequestと違ってクロスドメインの制約を受けません。この利点を利用して、scriptタグのsrc属性にWebサービスを呼び出すリクエストを記述し、その際に指定されたコールバック関数の中で結果を処理する、というマッシュアップを行うことができるようになります。ただし、このパターンに関してもJavascriptに関する知識がかなり必要となるでしょう。


figure3.gif

図3 JSONP


最後の方法は、自サーバをプロキシとして利用する方法と似ていますが、サーバ側でWebサービスを呼び出した後に、得られたXMLやJSONの中から欲しい情報を抜き出してマッシュアップする方法です(図4)。サーバ側での処理は増えますが、Javascriptをシンプルに記述することができるので、Java側のコーディングが得意な開発者が多い場合に適しています。


figure4.gif

図4 サーバサイドマッシュアップ


Webサービスの種類

Webサービスは、人間がWebブラウザを使ってアクセスするものではなく、情報を得るためにプログラムがアクセスするものです。そのために、Webサービスを利用するためのプログラム(クライアント)と、情報を提供するWebサービス(サーバ)との間で、通信のための共通的な取り決めが必要になってきます。この取り決めをプロトコルと言いますが、Webサービスでは、大きく分けて3つのプロトコルが採用されています。

  • SOAP
  • RESTful
  • REST準拠
SOAP

SOAPとは、Webサービスが提供する情報や処理を、XMLをベースにして呼び出す手順を取り決めたプロトコルです。扱われる情報は、SOAPによって取り決められたXMLの封筒に格納されて配送されます。SOAPの仕様は非常に複雑で重厚ですが、多くの場合その仕様を開発者が理解する必要はありません。

下記のような老舗的なWebサービスのほとんどが、SOAPをサポートしていました。しかし、最近では減少傾向にあるようです。

SOAPに対応したWebサービスにアクセスする場合、開発者は下記のどちらかの手法を選択することになります。

  • Webサービス側から提供されるクライアントライブラリを利用してWebサービスにアクセスする。
  • Webサービス側から提供されるWSDLからスタブコードを生成して、それを使ってWebサービスにアクセスする。

どちらの場合も、JavaのAPIを使ってWebサービスにアクセスすることが可能になるため、低レベルな通信を意識せずにWebサービスを利用できるという利点があります。ただし、Webサービスへのアクセスに何らかの認証が必要とされる場合に、複雑なAPIを使わなければならないといったことも考慮しなければなりません。

JavaにおいてSOAPに対応したWebサービスを扱う場合、下記のライブラリがよく使われます。

RESTful

次のRESTfulとは、HTTPのメソッドでよく使われるGETやPOSTに加えて、PUTやDELETEといったメソッドも使用してサーバ内の情報を取得あるいは操作を行うためのプロトコルです。サーバにある情報(リソースと呼ばれます)には、それを特定するためのURI(WebではURLに相当します)が決定されます。そのURIに対してDELETEメソッドを発行することによって情報の削除を依頼する、またはPUTメソッドを発行することにより情報を修正する、といった手順がRESTfulです。

RESTfulが盛んに言われるようになったのは最近ですので、RESTfulに対応したすぐにマッシュアップできるWebサービスはまだまだ数少ないです。しかし、今後増えてくることは確実です。

JavaでのRESTful対応Webサービスにアクセスするための手法についても、次々と登場することが予想されます。しかし、現時点での選択肢は残念ながら少なく、Jakarta Commons HttpClientなどを頼って自作するケースがほとんどでしょう。

REST準拠

RESTfulは、SOAPに比べるとかなり軽量な手順ですが、HTTPのPUTやDELETEといったメソッドを利用しなくてはいけない、URIの規約が堅い、などの点で取っ付きにくさがあります。そこで、単に情報を提供するだけのWebサービスでは、RESTfulに完全対応するのではなく、RESTfulの一部分のみを採用しているケースがほとんどだと言えるでしょう。情報の操作が必要なければ、基本的にGETメソッドのみで済みますので、情報を特定するためのURIのみREST風に決めてあげれば、RESTful準拠のWebサービスということになります。

REST準拠なWebサービスは、上記のSOAP対応のWebサービス全てが同時にRESTにも準拠しています。その他にも、下記のWebサービスがREST準拠です。

JavaでのREST準拠なWebサービスへのアクセスは、上記のJakarta Commons HttpClientを使用したり、java.net.URLConnectionによるアクセスなど、比較的低レベルなものを使用することで十分なケースがほとんどです。もちろん、Restletも使用することもできるでしょう。

Webサービスが返す情報の形式

Webサービスが返す情報の形式としては、一般的にXMLとJSONの2種類があります。利用者がどちらかを選べるパターンもあれば、どちらかに固定されているパターンもあります。最近では、選べるWebサービスが多くなってきました。

受け取ったXMLをJava内部で扱うには、そのままDOMやSAXパーサを利用して扱う方法もありますが、単調なコードの繰り返しとなり不具合が起こり易くなります。そこで、最近ではXMLとJavaオブジェクトをマッピングするためのライブラリが数多く出てきており、それらを使うことが一般的になってきています。主なライブラリとして、以下があげられます。

JSON(JavaScript Object Notation)とはもともとはJavaScriptにおけるデータ構造を記述するするための記法でした。それが、Ajaxで使用されるJavaScriptとサーバとのデータのやり取りに使われるようになり、2006年にはRFCで仕様が策定され現在では広く使われるようになりました。JSONで表現できるデータ型は、数値、文字列、真偽値、配列、ハッシュなどが表現でき、比較的簡単な記述でデータ構造をあらわすことができます。

Javaにおいても、もちろんJSONを扱うことが多くなってきています。JSONの記述とJavaオブジェクトをマッピングするライブラリとして、下記のライブラリが使われています。

技術を組み合わせる

ここまでで、Javaでのサーバサイドマッシュアップで使われる技術を見てきました。これらは、どれか一つを習得すれば良い、というものではなく、利用したいWebサービスの都合に応じて適用するライブラリや情報の形式を選択する、ということが求められます。もちろん、利用するライブラリは好みのものをチョイスして、使い倒します。この選択肢の広さが、Javaの醍醐味と言えるかもしれません。

今後の傾向としては、WebサービスはRESTfulを採用する流れが強くなっていくと予想されます。JavaEEの仕様にもRESTfulに対応するためのAPIが盛り込まれる予定ですので、今からウォッチしておくと良いでしょう。

次回は

今回はWebサービスで使われるプロトコルや情報の形式の紹介と、JavaでWebサービスにアクセスする際に使用する各種ライブラリを紹介しました。次回は、「イベント検索アプリケーション」に機能追加して、Javaでのサーバサイドマッシュアップを体験することにしましょう。