Axis2でREST(POX)形式のWebサービス
by simu
ここ最近、RESTについて調査していたのだが、どうも当初思っていた「HTTP GETするとXMLが返ってくる」ようなものは、RESTとは呼べないそうな。
この辺のRESTの本当の意味については、REST 入門 が一番参考になりそうなのでそちらを参照されたい。といっても、RESTについて説明されているサイトがあまりないですね。本来のRESTを実現したWebサービスってAtomPPを使用した、はてなサービスぐらいしかないのか?
で、今まで思っていた「HTTP GETするとXMLが返ってくるような」ものがRESTでないとすると、いったいなんだんだ?となってしまうが、これはPOX over HTTPとでも呼べば良いそうな。POXとはPlain Old XMLの略。
で、今回はAxis2を使用してREST(POX)のWebサービスを作成するサンプルを紹介します。
Axis2の現バージョンでは、REST(POX)までしかサポートされていないようだ。
(REST support in AXIS2 Java を見ると最新のソースでは、POST、PUT、GET、DELETEにも対応しているみたいだが。。。)
今回作成するものは、簡易的な勤怠管理サービスで、勤怠名に対して勤怠時間を管理することができるWebサービスです。プロジェクトは、Axis2のサンプル(quickstart)を元に作成しました。
ここ最近、RESTについて調査していたのだが、どうも当初思っていた「HTTP GETするとXMLが返ってくる」ようなものは、RESTとは呼べないそうな。
この辺のRESTの本当の意味については、REST 入門 が一番参考になりそうなのでそちらを参照されたい。といっても、RESTについて説明されているサイトがあまりないですね。本来のRESTを実現したWebサービスってAtomPPを使用した、はてなサービスぐらいしかないのか?
で、今まで思っていた「HTTP GETするとXMLが返ってくるような」ものがRESTでないとすると、いったいなんだんだ?となってしまうが、これはPOX over HTTPとでも呼べば良いそうな。POXとはPlain Old XMLの略。
で、今回はAxis2を使用してREST(POX)のWebサービスを作成するサンプルを紹介します。
Axis2の現バージョンでは、REST(POX)までしかサポートされていないようだ。
(REST support in AXIS2 Java を見ると最新のソースでは、POST、PUT、GET、DELETEにも対応しているみたいだが。。。)
今回作成するものは、簡易的な勤怠管理サービスで、勤怠名に対して勤怠時間を管理することができるWebサービスです。プロジェクトは、Axis2のサンプル(quickstart)を元に作成しました。
作成したものは、二つのJavaクラスと、service.xmlだけです。
WLDataクラスは、勤怠管理用のPOJOデータクラスです。
WLServiceクラスはサービスとして公開するサービスクラスです。
このサービスクラスで、3つのメソッドを公開するようにします。
- getWorkTime() 指定した勤怠名称の勤怠時間を取得
- add() 指定した勤怠名称の勤怠時間を追加
- getAllWL() 全ての勤怠を取得
また、勤怠時間の保存については、Hashクラスで誤魔化しています。
最後にservices.xmlです。「quickstart」にあるものを微修正しただけです。ServiceClassだけを変更すればOKです。
以上で作成するファイルは終了です。というかAxis2ではWebサービスを作成すればREST(POX)も自動的にサポートされます。
次に「quickstart」に用意されているbuild.xmlを借用して、WLService.aarファイルを作ります。今回はAxis2に用意されているSimpleAxis2Serverを使用してサービスを確認します。WLService.aarをaxis2-1.2\repository\servicesにデプロイすれば準備完了です。
REST(POX)はURIの操作だけなので、特にクライアントを用意せずに確認してみます。
始めにアドレスバーにhttp://localhost:8080/axis2/services/と打ち込み、デプロイされていることが確認します。
次にaddメソッドを以下のパラメタで叩き、AACの勤怠時間を4.5にしてみます。
- workLoadTime = AAC
- time = 4.5
上記メソッドを叩くために、URLは以下のようにします。
http://localhost:8080/axis2/services/WLService/add?workLoadName=AAC&time=4.5
このメソッドはvoid型なので、プラウザには何も表示されません。登録できたか、以下のURLで確認してみます。
うまく登録されているようです。では、連続的に以下のURIを叩いてみます。
http://localhost:8080/axis2/services/WLService/add?workLoadName=ZZZ&time=9.0 ZZZに9.0時間割り当てる
http://localhost:8080/axis2/services/WLService/add?workLoadName=AAC&time=5.0 AACに5.0時間追加する
http://localhost:8080/axis2/services/WLService/getAllWL 全ての勤怠を表示する
getAllWLの表示を見ると、、、
うまく機能しているようですね。
出力を見る限り、SOAPメソッドのEnvelopeを取り除いた形を出力するようです。あんまり見栄えは良くないですね。おそらくカスタマイズすればもうちょっと、見られるXMLにはなると思います。
JavaのRESTの他の実装としてRestlet というRESTに特化したフレームワークもあるようです。ただあまり使われていないようですが。。。
今後REST(POX)を活用して、勤怠管理のWebサービス及びクライアントを作りたいと考えています。
構想としては以下。
- サーバサイドは、Java又はRuby(Ruby On Rails)でWebサービスとして作成
- クライアントサイドは、HTML + JavaScriptだけで作成
- 認証 と クライアントサイドのJavaScriptの勉強が課題
- サーバサイドは何とかなるのでは?
WLDataクラスは、勤怠管理用のPOJOデータクラスです。
WLServiceクラスはサービスとして公開するサービスクラスです。
このサービスクラスで、3つのメソッドを公開するようにします。
- getWorkTime() 指定した勤怠名称の勤怠時間を取得
- add() 指定した勤怠名称の勤怠時間を追加
- getAllWL() 全ての勤怠を取得
また、勤怠時間の保存については、Hashクラスで誤魔化しています。
最後にservices.xmlです。「quickstart」にあるものを微修正しただけです。ServiceClassだけを変更すればOKです。
以上で作成するファイルは終了です。というかAxis2ではWebサービスを作成すればREST(POX)も自動的にサポートされます。
次に「quickstart」に用意されているbuild.xmlを借用して、WLService.aarファイルを作ります。今回はAxis2に用意されているSimpleAxis2Serverを使用してサービスを確認します。WLService.aarをaxis2-1.2\repository\servicesにデプロイすれば準備完了です。
REST(POX)はURIの操作だけなので、特にクライアントを用意せずに確認してみます。
始めにアドレスバーにhttp://localhost:8080/axis2/services/と打ち込み、デプロイされていることが確認します。
次にaddメソッドを以下のパラメタで叩き、AACの勤怠時間を4.5にしてみます。
- workLoadTime = AAC
- time = 4.5
上記メソッドを叩くために、URLは以下のようにします。
http://localhost:8080/axis2/services/WLService/add?workLoadName=AAC&time=4.5
このメソッドはvoid型なので、プラウザには何も表示されません。登録できたか、以下のURLで確認してみます。
うまく登録されているようです。では、連続的に以下のURIを叩いてみます。
http://localhost:8080/axis2/services/WLService/add?workLoadName=ZZZ&time=9.0 ZZZに9.0時間割り当てる
http://localhost:8080/axis2/services/WLService/add?workLoadName=AAC&time=5.0 AACに5.0時間追加する
http://localhost:8080/axis2/services/WLService/getAllWL 全ての勤怠を表示する
getAllWLの表示を見ると、、、
うまく機能しているようですね。
出力を見る限り、SOAPメソッドのEnvelopeを取り除いた形を出力するようです。あんまり見栄えは良くないですね。おそらくカスタマイズすればもうちょっと、見られるXMLにはなると思います。
JavaのRESTの他の実装としてRestlet というRESTに特化したフレームワークもあるようです。ただあまり使われていないようですが。。。
今後REST(POX)を活用して、勤怠管理のWebサービス及びクライアントを作りたいと考えています。
構想としては以下。
- サーバサイドは、Java又はRuby(Ruby On Rails)でWebサービスとして作成
- クライアントサイドは、HTML + JavaScriptだけで作成
- 認証 と クライアントサイドのJavaScriptの勉強が課題
- サーバサイドは何とかなるのでは?