2007-09-23

RailsでWebサービスを作成し、FlexからSOAPで呼び出す(Rails編)

Railsには ActionWebServiceというものが用意されていて、SOAPやXML-RPCで呼び出せるいわゆる Webサービスを簡単に作ることができる。

ActionWebServiceで作成された Webサービスは、Flexに用意されている WebServiceクラスから簡単に利用することが出来る。この時用いられるプロトコルは SOAPとなる。

「SOAPの Sが Simpleの Sだというのは悪い冗談だ」と巷では評判だが、ことミドルウェアがよく整備されており自分がそれをただ使えば良いだけの立場でいる場合においてはさして問題ないと感じる。

FDSや RED5, S2Flex, RubyAMFといった AMFベースのミドルウェアでサービスを実装した場合、バイナリプロトコル故に少ないオーバーヘッドでのリモート呼び出しが可能な反面、それと組み合わせる RIAのプラットフォームは当然のことながら Flex(Flash)に限定されてしまうわけだが、.NETや Silverlightといった他のリッチUIプラットフォームや、サーバ間でのRPCなども視野に入れたいのであれば、(さしあたり Flexをターゲットとするにせよ)プラットフォーム非依存のプロトコルである SOAPを選択することも理に適っているだろう。

前口上は終了。というわけで、まず実際に Rubyで Webサービスを実装してみる。

ここでは、helloという名前の適当なWebサービスを作ることにする。雛形は script/generateで作れる。

$ ./script/generate web_service hello

で、app/apis/hello_api.rb と app/controller/hello_controller.rbが作成される(test/functional/hello_api_test.rbも)。

hello_api.rbの中に HelloApiなるクラスがあるので、所定の書式で helloサービスに持たせたいメソッドの定義を追加する。このクラスに記述された内容は Webサービスのインターフェイス定義として作用することになり、WSDLにも反映される。

api_method :メソッド名, :expects=>[引数定義], :returns=>[返値定義]

引数は{名称シンボル=>型シンボル}の形式で、カンマ区切りで複数持つことができる。
返値は型シンボルだけの記述でも良い。

型を示すシンボルとしては
:string, :int, :bool, :float, :time, :datetime, :date, :base64
が使える。そのほか、構造を持ったデータを引数や返値に使いたければこれらのシンボルの代わりに ActionWebService::Structや ActiveRecord::Baseを継承するクラスを指定することも出来る。
また、型指定子を []で囲むとArrayの意味になる。([:string]は StringのArray)
構造は入れ子に出来るため、階層構造を持ったデータの入出力も可能である。

# Helloという Webサービスのインターフェイスを表現するクラス
class HelloAPI < ActionWebService::API::Base
# nameという文字列引数を取り、文字列を返す say_hello メソッドの定義
# Railsのお節介により、外からは SayHelloという名前で呼び出されるようになる。
# (お節介を抑制するには inflect_names false とする)
api_method :say_hello, :expects=>[{:name=>:string}], :returns=>[:string]
end

次に実装を行う。生成された hello_controller.rbには普通に Railsを使うときと同様空の Controllerクラスが置かれているので、先の HelloApiクラスで定義したメソッドをこの中に実装する(直接コントローラクラスに実装を記述しない方法もある。必要なら Delegated dispatching, Layered dispatchingの情報を検索されたし)。

# Helloという Webサービスを実装するコントローラクラス
class HelloController < ApplicationController
# メソッドsay_helloの実装。
def say_hello(name)
# 名前を聞いて、こんにちは、○○さん。って言うだけ。
"Hello, " + name
end
end

Webサービスを実装したら Railsを起動してクライアントからの呼び出しに備える(Railsの最も簡単な起動方法:./script/server を実行すると 3000番ポートでHTTPの接続待ちになる)。
/コントローラ名/service.wsdl で WSDLへアクセス出来るので、SOAPクライアントから hello Webサービスを利用するにはまず http://my-rails-host:3000/hello/service.wsdl をロードさせれば良い。WSDLにはサービスのエンドポイントとなる URIや各メソッドの詳細など、実際のサービス呼び出しに必要な全ての情報が書かれている。

参考文書:http://manuals.rubyonrails.com/read/chapter/67

Flex編へ続く

ラベル:

0 件のコメント:

コメントを投稿

<< ホーム