気になる開発プロダクツ

第3回 Restlet 1.0.1-RESTアプリケーションを手軽に実現するフレームワーク

この記事を読むのに必要な時間:およそ 5 分

Restletとは?

Restlet(http://www.restlet.org/)は,Web APIなどで主流となっているREST(REpresentational State Transfer)型の通信を行うアプリケーションを構築する「軽量な(Lightweight)」Javaフレームワークです。CDDL1.0とGPL2.0のデュアルライセンスの下で配布されています。開発はフランスのNoelios Consulting社(http://www.noelios.com/:フランス語)が主体となって行っています。バージョン1.0.1がリリースされたのは2007年5月3日です。

JavaのREST APIといえば,JAX-RS(JSR 311)の仕様をJCPで詰めている最中ですが,Restletではバージョン2.0のAPIをJCPに提出することを計画しています(2007年4月25日付のNoeliosのブログより)。

なぜRestletという名称なのかについて,開発者による記述を見つけることはできませんでしたが,おそらくサーブレット(Servlet)やアプレット(Applet)と同じように,RESTに「小さいもの」を表す接尾辞の-letをつけることで,RESTアプリケーションを手軽に開発できるフレームワークにしたいという意味を込めているのでしょう。

RestletによるRESTアプリケーション

REST自体のことについては,別のWebサイトや書籍などに説明を委ねることにして,Restletにより構築できるアプリケーションとはどんなものなのか,さっそく短いメッセージを出力する(いわゆるHello World)クラスをリスト1に示します。これを含め,本稿で紹介するリストはJDK 6u1の環境で実行を確認しています。

リスト1 短いメッセージを出力するRESTアプリケーションの例

Restlet restlet = new Restlet()  {
  @Override
  public void handle( Request request, Response response )  {
    response.setEntity(
      new StringRepresentation(
        "はじめてのRestlet", MediaType.TEXT_PLAIN,
        new Language( "ja" ), new CharacterSet( "Shift_JIS" )
      )
    );
  }
};

表示領域の関係でネストが深くなっていますが,整理して説明しましょう。

RestletによるRESTアプリケーションは,Restletクラスのhandle()メソッドをオーバーライドしたサブクラスとして構築できます。サーブレットがHttpServletクラスのdoGet()やdoPost()の各メソッドをオーバーライドするのと似ています。handle()メソッドの引数Requestと同じく,ResponseはサーブレットのServletRequestおよびServletResponseと意味は似通っていますが,データを設定したり取得したりする方法が異なります。

レスポンスとして返すデータはResponse#setEntity()メソッドで設定します。日本語を含まない半角テキスト(ASCIIコード)であれば,このメソッドで直接テキストを設定できますが,日本語を含むテキストの場合は,文字化けを防ぐためにStringRepresentationやCharacterSetなどのクラスを使っています。

レスポンスには,XML,ファイル,シリアライズ可能なオブジェクトなどを設定することができます。クラスやメソッドの詳細は,バージョン1.0のAPIドキュメントを参照してください。

サーバの設定と起動

RESTアプリケーションは,その性格上,サーバ内で動作させる必要があります。RestletではServerクラスが用意されていますので,それを設定しておきます。設定といっても,リスト2のとおりインスタンスを生成し,start()メソッドでサーバを起動させるだけです。起動後はクライアントからのアクセス待ちになるため,停止するにはCtlr+Cを押すか,このプロセスを停止させます。設定ファイルやTomcatなどのアプリケーションサーバを別に用意しなくても良いところが「軽量さ」をよく表しています。

リスト2 RESTアプリケーションを動作させるサーバの設定と起動の例

Server server = new Server( Protocol.HTTP, 8888, restlet );
server.start();

Serverクラスのコンストラクタには,使用するプロトコルの種類,ポート番号,動作させるRESTアプリケーションを引数として与えます。これによって,設定とデプロイが完了することになります。

このロジックは一般的なJavaクラスの中で記述できますので,実際の起動はjavaコマンドで行うことができます。ただし,Restletは依存ライブラリの数(アーカイブを展開したlibディレクトリ以下のJARファイルすべて)が多いので,antなどでJARファイルをクラスパスに設定して,コンパイルや起動を行うほうが良いかもしれません。

ここでは1つのRESTアプリケーションのみを設定していますが,もちろん複数のアプリケーションを1つのサーバに設定することは可能です。バージョン1.0のチュートリアルを参考にして挑戦してみてください。

クライアントアプリケーションによるアクセス

サーバを起動できたら,クライアントからアクセスしてみます。もっとも簡単な方法はWebブラウザでアクセスすることです。図1のようにメッセージが表示できれば,ひとまずRESTアプリケーションは完成です。

図1 WebブラウザからRESTアプリケーションにアクセス

図1 WebブラウザからRESTアプリケーションにアクセス

ただRESTアプリケーションの構築は,その性格上,Webブラウザからのアクセスを受け付けることを主な目的とするわけではなく,別のクライアントアプリケーションからのアクセスを受け付けて,マッシュアップ(Mash up)してもらえるようにすることが主な目的のはずです。次はそのためのクライアントアプリケーションについて説明します。

リスト3 RESTアプリケーションにアクセスするクライアント

Client client = new Client( Protocol.HTTP );
Response res = client.get( "http://localhost:8888/" );
System.out.println( res.getEntity().getText() );

リスト3のClientクラスが,RESTアプリケーションにアクセスするクライアントになります。コンストラクタの引数で,サーバへのアクセスに使用するプロトコルを設定します。ここではHTTPのみを設定していますが,複数のプロトコルも利用可能です。

もしRestletを使わない場合は,おそらくJakarta Commons HttpClientなどを用いることになりますが,同じフレームワークのクラスを用いるほうが,複数のフレームワークが混在することを避けられますので,実行環境をシンプルにしておくことができます。これにより,依存ライブラリの管理などのメンテナンスがしやすくなります。これも「軽量」の意味に含まれると言って良いのではないでしょうか。

このクラスのget()メソッドがHTTPのGETに対応し,直観的なプログラミングを可能にしています。引数で与えるURLがサーバの設定と一致しているかどうかを確認しましょう。サーバからのレスポンスとなるメッセージは,メソッドの戻り値であるResponseインスタンスから取得できます。

リスト3のロジックを起動してサーバにアクセスするには,サーバとは別のDOSプロンプトやターミナルのウィンドウを開き,その中でjavaコマンドを実行します。図1と同じメッセージがウィンドウに表示されれば,これでクライアントの構築も完了です。このときサーバ側のウィンドウに例外がスローされるかもしれませんが,接続がクローズされるだけで処理は継続され,次のリクエストを受け付けられる状態になります。

このように,Restletを使うと,同じフレームワークのクラスを用いて,シンプルな方法と環境でRESTアプリケーションを構築することができます。ですが,これではあまりにシンプルで物足りないという読者がいらっしゃいましたら,この後ももう少しお付き合いください。

POSTメソッドの実行

著者プロフィール

沖林正紀(おきばやしまさのり)

SE/プログラマを経て,WebアプリケーションやXMLなどについて雑誌記事や書籍の執筆活動を始める。大手メーカで製品資料の作成や,セミナーの講師を担当したこともある。現在は,取材記事や製品レビューなどに執筆活動の幅を広げる一方,プログラミング教材の開発も手がけている。

著書

コメント

コメントの記入