GitHub

RubySOAP

RubyでSOAPを扱う際のメモです。

SOAPとは

XMLでRPC(Remote Procedure Call)するためのプロトコル。{{fn "いわゆるXML-RPCとは別物。XML-RPCに機能を追加してSOAPができたという関係らしい http://ja.wikipedia.org/wiki/XML-RPC"}}

SOAPのためのライブラリ

  • Ruby 1.8: 標準添付のsoapか、gemのsoap4rを使う(バージョンが違う) {{fn "ソース:https://github.com/nahi/soap4r"}}
  • Ruby 1.9: gem install soap4r-ruby1.9

http://rubygems.org/gems/soap4r

公式サイトは死んでいる(2011-05現在)。WebArchive

一応自動生成のrdocはある:http://rubydoc.info/gems/soap4r/1.5.8/frames

クラス数がかなり多い。

  • SOAP::は本体。
  • WSDL::はWSDL (SOAPで提供するAPIのインターフェイスを定義するXMLファイル) のためのクラス。
  • XSD::はXSD (XMLのスキーマ) のためのクラス。

参考資料

頑張ってGoogleで調べましょう。

rubyでsoapサーバを作る - hippos-lab::net

  1. WSDLの作成
  2. wsdl2rubyでスケルトンを生成
  3. 中身を実装

という手順らしい。

とりあえず順にやってみる。提供するAPIは

 int add(int a, int b)

にしようか。

types

  • APIで使う型を定義する。
  • 基本的なもの(真偽値・数値・時間・文字列・URLなど)はXSDに用意されている。 http://www.atmarkit.co.jp/fxml/rensai2/schema04/schema04.html
  • それ以外の自前のオブジェクトというか構造体を使いたい場合はxsd:complexTypeで型を定義する。

message

  • APIのリクエストとレスポンス(≒引数と返り値)を定義する。
  • リクエストは<メソッド名>Request、レスポンスは<メソッド名>Responseという名前にする
  • voidの場合は空タグを書く形になる。

porttype

  • APIのメソッド名と引数・返り値を定義する。
  • 引数・返り値の仕様は、上で定義したmessageを参照する。

binding

"binding要素では、portTypeで定義したオペレーション物理モデルとしてどのように変換され使用されるかを定義します。"

service

APIのアクセスポイント(URL)を書く。

コード生成

 wsdl2ruby.rb --wsdl a.wsdl --type server --force

4つのファイルができる。

 wsdl2ruby.rb --wsdl a.wsdl --type client --force

2つのファイルができる。

とりあえずAPI側はCalcServerServant.rb、クライアント側はCalcServerClient.rbだけ編集すればOK。

ソース:https://gist.github.com/968278

実行

ターミナル1

 $ ruby -I. CalcServer.rb

ターミナル2

 $ ruby -I. CalcServerClient.rb
 3
source: RubySOAP.hd
View on github | Report issue