The HIRO Says

If you smell what The HIRO is cooking!!!

restletを使用したWebサービスの構築・公開

GAE から他の Web サービスを呼び出すには、基本的には URL Fetch を使えばOKです。
では、GAE 上で Web サービスを構築・公開するには、一体どうすれば良いのでしょうか?
コチラによると、restlet で実現可能とのことでしたので、試してみることにしました。


ちなみに、restlet を GAE/J で使用する方法については、下記サイトを参考にしました。
http://wiki.restlet.org/docs_2.0/13-restlet/275-restlet/252-restlet.html


また、筆者は REST を「SOAP よりも簡単な Web サービス」という程度でしか知りませんので、REST について至らない点はご容赦下さい。


1.環境設定方法

(1)restlet の「Version 2.0 Snapshot」を、ここからダウンロードします。

  1. 色々ある Edition のうち、「Edition for Google App Engineを選択します。
  2. 「Zip archive」を選択します。
  3. 「restlet-gae-2.0snapshot.zip」という名前のファイルをダウンロードできます。


(2)ダウンロードした「restlet-gae-2.0snapshot.zip」を、
   任意のディレクトリに解凍します。


(3)解凍先ディレクトリ/lib にある、下記の2つの JAR ファイルを、
   GAE プロジェクトの war/WEB-INF/lib にコピーします。

  1. org.restlet.jar
  2. org.restlet.ext.servlet.jar


(4)上記の2つの JAR ファイルを、クラスパスに追加します。


これで、環境設定は完了です。


2.サービスの構築方法

今回は、アクセスされたら何らかの String を返す、簡単な Web サービスの構築方法を簡単にまとめます。


(1)org.restlet.resource.ServerResource を継承したクラスを作成します。
サーバとして提供したい具体的な処理を、ここに記述します。
提供するメソッドは、getVariants() メソッドをオーバーライドするか、
@Get・@Post アノテーションを付加する形で実装します。


以下は、@Get アノテーションを使用した、注文件数を注文 Service を介して渡す例です。

package xxx.yyy;

import org.restlet.resource.Get;
import org.restlet.resource.ServerResource;

public class OrderResource extends ServerResource {

    @Get
    public String represent() {
        return "注文件数は" +
                new OrderService().getCount() + "件です。";
    }
}


(2)org.restlet.Application を継承したクラスを作成します。
外部システムとのやりとりの仕方を、ここに記述します。
今回のように、外部からのアクセスに対して上記(1)の結果を返す場合は、createInboundRoot() メソッドをオーバーライドし、以下の処理を記述します。

  1. org.restlet.routing.Routerインスタンスを生成します。
  2. 上記(1)の Resource を、Router に登録します。
  3. Router を戻り値として返します。


以下は、上記(1)の OrderResource を使えるようにする例です。

package xxx.yyy;

import org.restlet.Application;
import org.restlet.Restlet;
import org.restlet.routing.Router;

public class OrderApplication extends Application {

    @Override
    public Restlet createInboundRoot() {
        Router router = new Router(this.getContext());
        router.attachDefault(OrderResource.class);
        return router;
    }
}


(3)web.xml に、org.restlet.ext.servlet.ServerServlet の定義を追加します。
ServerServlet は、restlet 用のサーブレットです。
これに、init-param で上記(2)の Application を登録し、
GAE アプリケーションとして使用できるようにします。


以下の例では、/rest へアクセスすることで、OrderResource#represent() の戻り値を取得できるようになります。

    
        RestletServlet
        
            org.restlet.ext.servlet.ServerServlet
        
        
            org.restlet.application
            xxx.yyy.OrderApplication
        
    

    
        RestletServlet
        /rest
    

3.課題

今回の例は String を返すだけでしたが、
もっと複雑なオブジェクトをやりとりする方法について、
今後検討していきたいと考えています。