ファイヤープロジェクト
Restletの主要なクラスをじっくり見てみる(その3 FinderとHandler)
2008-12-20T09:15+09:00   matsu
そろそろREST(Representational State Transfer)と言っている割りに,いつになったらその「Representation」が出て来るんだ?と思えて来る.HandlerはそのRepresentationを扱うResourceの親.そしてFinderはHandlerを見つけて生成するRestletである.
Handlerは,リクエストに応じてハンドルするものである. 使い方は,
  1. コンストラクタで生成する(普通にnewする)
  2. initメソッドで初期化する
    void init(Context context, Request request, Response response)
    
    そのHandlerオブジェクトが仕事をするために,ほとんど常に必要な処理.
  3. 「allowHTTPメソッド名」メソッドで,そのHTTPメソッドが使用可能かどうかをチェック. より具体的には,
    • boolean allowDelete()
    • boolean allowGet()
    • boolean allowHead()
    • boolean allowOptions()
    • boolean allowPost()
    • boolean allowPut()
    である. Handlerクラスではfalseを返すようになっていて,サブクラスでオーバーライドする. 先にinitメソッドを実行していれば,このメソッド内で
    Request	getRequest()
    
    Context getContext()
    
    などして,状況に応じてそのHTTPメソッドが使用可能かどうかを判定できる.
  4. 「handleHTTPメソッド名」で,実際に処理する. やはり先にinitメソッドを実行していれば,このメソッド内で(以下同文).
このように,Handlerは,基本的にHTTPを前提としているような雰囲気であるが,そこは使い方の問題なのでHTTP以外にも追うよう可能だと思う.
前頁まで,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になる.
matsu(C)
Since 2002
Mail to matsu