読者です 読者をやめる 読者になる 読者になる

ActionWebService を使うアプリケーションを作成する手順

Ruby Rails AWS

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 に書かれるようになった。