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」を、ここからダウンロードします。
- 色々ある Edition のうち、「Edition for Google App Engine」を選択します。
- 「Zip archive」を選択します。
- 「restlet-gae-2.0snapshot.zip」という名前のファイルをダウンロードできます。
(2)ダウンロードした「restlet-gae-2.0snapshot.zip」を、
任意のディレクトリに解凍します。
(3)解凍先ディレクトリ/lib にある、下記の2つの JAR ファイルを、
GAE プロジェクトの war/WEB-INF/lib にコピーします。
- org.restlet.jar
- 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() メソッドをオーバーライドし、以下の処理を記述します。
- org.restlet.routing.Router のインスタンスを生成します。
- 上記(1)の Resource を、Router に登録します。
- 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 を返すだけでしたが、
もっと複雑なオブジェクトをやりとりする方法について、
今後検討していきたいと考えています。