Restletの主要なクラスをじっくり見てみる(その3 FinderとHandler)
そろそろREST(Representational State Transfer)と言っている割りに,いつになったらその「Representation」が出て来るんだ?と思えて来る.HandlerはそのRepresentationを扱うResourceの親.そしてFinderはHandlerを見つけて生成するRestletである.
Handlerは,リクエストに応じてハンドルするものである.
使い方は,
- コンストラクタで生成する(普通にnewする)
- initメソッドで初期化する
void init(Context context, Request request, Response response)
そのHandlerオブジェクトが仕事をするために,ほとんど常に必要な処理. - 「allowHTTPメソッド名」メソッドで,そのHTTPメソッドが使用可能かどうかをチェック.
より具体的には,
- boolean allowDelete()
- boolean allowGet()
- boolean allowHead()
- boolean allowOptions()
- boolean allowPost()
- boolean allowPut()
Request getRequest()
やContext getContext()
などして,状況に応じてそのHTTPメソッドが使用可能かどうかを判定できる. - 「handleHTTPメソッド名」で,実際に処理する. やはり先にinitメソッドを実行していれば,このメソッド内で(以下同文).
前頁まで,Restletの話をしてきて,前節で突然Handlerが出てきた.
FinderはRestletとHandlerをつなぐ役割を果たす.
Finderはその名の通り,Handlerを見つけ,さらに生成まで行い,さらにさらに生成したHandlerのハンドリング(前節で記述した内容)を処理する.
これらは他のRestletと同様,handleメソッド内で行う.
「見つける」というのは,文字列のHanlderクラス名を受け取って,リフレクションで生成してくれるということである(※).
わざわざこんな仕組みを作っているのは,XML設定ファイルで文字列で独自ルータークラスを指定できるようにするなどするためのようである.
また,前節でHandlerで扱うHTTPメソッドについて記述したが,それ以外のメソッドがあったとしても対応できる.
つまり,やはりリクレクションによって,
allow独自メソッド名 handle独自メソッド名を呼び出し,ほかのHTTPメソッドの場合と同様に処理する.
※ 他にもクラスのロード処理を明示的に行っている雰囲気だが,よくわからない.
上記を確認するためのサンプルを作成してみた.
まず,サンプルのHandlerは,リクエストクエリの値に応じて,Getメソッドの処理可否をかえるようにしてみた.
そしてFinderは
このサンプルは,
http://localhost:8182/?allowGet=trueでは200が返り,
http://localhost:8182/?allowGet=falseでは405エラーになる.
また,GET以外のメソッドも405になる.

