ActionWebService を使うアプリケーションを作成する手順
ActionWebServiceを使う簡単なアプリケーションを作成した。AWSを使うとき毎回参考にしてるのはこのページ。
参考になります。
AWSを使ったウェブサービスの開発手順
最初にrailsアプリケーションを生成する。
$ rails awstest
続いて、web_serviceジェネレータでAWSの雛形を作る。サービス名はTrial、メソッド名としてget_infoを指定した。
$ cd awstest $ ./script/generate web_service Trial get_info
APIを編集する。./apps/apis/trial_api.rbを開いて、
class TrialApi < ActionWebService::API::Base api_method :get_info, :expects => [{:key => :string}], :returns => [:string] end
で保存する。get_infoメソッドは引数に文字列keyを取り、文字列を返すことにする。
コントローラを実装する。./apps/controllers/trial_controller.rb
class TrialController < ApplicationController wsdl_service_name 'Trial' web_service_scaffold :invoke def get_info(key) p key return "aaa" end end
上のようにget_infoメソッドを実装する。更にscaffoldの設定を追加した。これでサーバ側は完成。
確認のためサーバを起動する。
$ ./script/server
scaffoldにブラウザでアクセス。うまく動いているか確認する。ついでにWSDLも見てみる。
クライアントを実装する
次に、作成したTrialウェブサービスを利用するクライアントを、同じrails上に実装してみる。
最初にclientコントローラを生成。
$ ./script/generate controller client get_info
./controllers/client_controller.rbを編集。
class ClientController < ApplicationController def get_info client = ActionWebService::Client::Soap.new(TrialApi, "http://localhost:3000/trial/api") render :text => client.get_info("xxx") end end
これでクライアント側も完成。
しかし、このまま http://localhost:3000/client/get_info にアクセスすると、アプリケーションがフリーズしてしまう。Railsはロジックが排他的に実行されるので、clientコントローラ実行中はTrialサービスを実行できない。
このフリーズ問題を回避するため、クライアントを別のポートで起動する。
$ ./script/server -p 3001
ブラウザで3001番ポートにアクセス。
うまくいけば、3000番ポートのTrialサービスから返された "aaa" が表示されるはず。
カスタムのdevelopment2環境を追加
以下はAWSとは全然関係ない話。
クライアントとサーバをポートを変えただけの同じ環境で動かしているため、ログが両方とも ./logs/development.log に書かれてしまって気持ちが悪い。そこで、新たにdevelopment2環境を追加してみる。
./config/environments/development.rbを development2.rbにコピー。
$ cd ./config/environments/ $ cp development.rb development2.rb
更に、./config/database.ymlを開いて、development:以下をdevelopment2:としてコピーする。データベースなんか使ってないけど、ここを変えないとエラーになってしまう。
クライアントの方をdevelopment2環境で起動する。
$ ./script/server -p 3001 -e development2
これで、クライアント側のログは ./logs/development2.log に書かれるようになった。