rubyでSOAP-RPCサーバを作る

rubyでSOAP-RPCサーバを作成するには、soap4rパッケージを導入します。このコンテンツではwsdlを提供するSOAP-RPCサーバのサンプルを作成します。

soap4rを使用して、SOAP-RPCサーバの作成手順は

  1. サービスのインタフェースを記述したWSDLを作成します。
  2. wsdl2rubyを使用して、作成したWSDLファイルからruby実装クラスのスケルトンを作成します。
  3. スケルトンに処理を実装します。

となり、このステップを繰り返しながら完成させていきます。soap4rに添付のsampleファイルをみればわかりますが、wsdlを提供しないSOAP-RPCサーバも作成することができますが、インターネットに向けてサービスを提供するのであればWSDLは作成したほうが良いでしょう。

早速、WSDLの作成からはじめます。

WSDLの構成要素

WSDLの構成要素は下記のとおりとなります。

definitions
WSDL全体をまとめるタグ。WSDLで使用する名前空間の属性を付加します。
types
サービスで使用するデータタイプ(型)の定義します。通常、XML Scheamを使用して定義おこないます。
message
1回のrequstまたはresponseで使用するメッセージを定義します。メッセージが使用するデータタイプ(<part>~</part>)を0個以上含みます。
portType
<message>~</message>で定義されたメッセージをオペレーション(メソッド)の引数セットとしてまとめます。
binding
提供するサービスを具体的な詳細を(プロトコルやメッセージ)を定義します。soapサービスに関してはwsdl/soapビルトインを使用して記述します。
service
提供するサービスの具体的なアクセスポイント(URI)を定義する。

WSDLの作成

作成するサンプルメソッド

以下、具体的に提供するメソッドと対比させながらWSDLを作成していきます。サンプルとして価格を指定して指定した価格以下の商品名称を調べるサービスを作成します。サービスとして以下の3つのメソッドをを提供するものとします。

  1. boolean ServiceStart(void) : サービスの初期化
  2. vector<ItemInfoResult> GetItemInfoByPrice(unsigned int) : 情報(名前・価格)の取得
  3. void ServiceEnd(void) : サービスの終了

外枠構成要素

まず、外枠を記述し個別に中身を記述していきます。definitionsタグの属性値として以降のWSDL記述で使用する各種namespace(名前空間)を定義しています。

<?xml version="1.0" encoding="UTF-8"?>
<definitions
  name="LovemacService"
  targetNamespace="urn:LovemacService"
  xmlns:typens="urn:LovemacService"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  xmlns="http://schemas.xmlsoap.org/wsdl/">
  <types>
  <!-- type定義 -->
  </types>
  <message>
  <!-- message定義 -->
  </message>
  <portType>
  <!-- portType定義 -->
  </portType>
  <binding>
  <!-- binding定義 -->
  </binding>
  <service>
  <!-- service定義 -->
  </service>
</definitions>

以降、個々の要素の定義を具体的に記述してwsdlを完成させます。