Ruby Web Service アプリケーション - SOAP4R


SOAP とは?

簡易オブジェクトアクセスプロトコル(SOAP、正式名称は Simple Object Access Protocol)は、データを交換するためのプロトコル仕様です。

SOAP は XML ベースのシンプルなプロトコルであり、アプリケーションが HTTP を介して情報を交換できるようにします。

簡易オブジェクトアクセスプロトコルは、データを交換するためのプロトコル仕様であり、軽量でシンプルな XML(SGMLのサブセット)ベースのプロトコルです。WEB上で構造化された固定情報を交換するように設計されています。

その他の SOAP チュートリアルはこちらを参照してください:http://www.w3cschool.cc/soap/soap-tutorial.html。


SOAP4R のインストール

SOAP4R は Hiroshi Nakamura によって開発・実装され、Ruby の SOAP アプリケーションに使用されます。

SOAP4R ダウンロード先:http://raa.ruby-lang.org/project/soap4r/。

注意:お使いの Ruby 環境には、このコンポーネントがすでにインストールされている可能性があります。

Linux 環境では、gem を使用してこのコンポーネントをインストールすることもできます。コマンドは次のとおりです:

gem install soap4r --include-dependencies

Windows 環境で開発する場合は、zip 圧縮ファイルをダウンロードし、install.rb を実行してインストールする必要があります。


SOAP4R サービス

SOAP4R は2つの異なるサービス形式をサポートしています:

  • CGI/FastCGI ベースのサービス (SOAP::RPC::CGIStub)
  • 独立サービス (SOAP::RPC:StandaloneServer)

このチュートリアルでは、独立した SOAP サービスを構築する方法を紹介します。手順は次のとおりです:

ステップ1 - SOAP::RPC::StandaloneServer を継承

独自の独立サーバーを実装するには、SOAP::RPC::StandaloneServer のサブクラスである新しいクラスを作成する必要があります:

class MyServer < SOAP::RPC::StandaloneServer ............... end

注意:FastCGI ベースのサーバーを作成する場合は、SOAP::RPC::CGIStub クラスを継承する必要があります。プログラムの残りの部分は変更されません。

ステップ2 - 処理メソッドを定義

次に、Web Service のメソッドを定義します。以下では、2つの数値を加算するメソッドと、2つの数値を除算するメソッドの2つを定義します:

class MyServer < SOAP::RPC::StandaloneServer ............... #処理メソッド def add(a, b) return a + b end def div(a, b) return a / b end end

ステップ3 - 処理メソッドを公開

次に、サーバー上で定義したメソッドを追加します。initialize メソッドは公開されており、外部からの接続に使用されます:

class MyServer < SOAP::RPC::StandaloneServer def initialize(*args) add_method(receiver, methodName, *paramArg) end end

各パラメータの説明は以下のとおりです:

パラメータ説明
receiverサービスメソッドを保持するオブジェクト。同じクラス内でサービスメソッドを定義する場合、このパラメータはself。
methodNameRPC リクエストで呼び出すメソッド名。
paramArgパラメータ名とパラメータモード

理解するためにinoutとoutパラメータについて、以下のサービスメソッドを考えてみましょう。2つのパラメータ inParam と inoutParam を入力として受け取り、関数の実行完了後に retVal、inoutParam、outParam の3つの値を返します:

def aMeth(inParam, inoutParam) retVal = inParam + inoutParam outParam = inParam . inoutParam inoutParam = inParam * inoutParam return retVal, inoutParam, outParam end

公開された呼び出しメソッドは次のとおりです:

add_method(self, 'aMeth', [ %w(in inParam), %w(inout inoutParam), %w(out outParam), %w(retval return) ])

ステップ4 - サービスを開始

最後に、派生クラスをインスタンス化し、start メソッドを呼び出してサービスを起動します:

myServer = MyServer.new('ServerName', 'urn:ruby:ServiceName', hostname, port) myServer.start

リクエストパラメータの説明は以下のとおりです:

パラメータ説明
ServerNameサービス名。お好みの名前を付けることができます
urn:ruby:ServiceNameHere urn:ruby固定されていますが、サービスに一意の名前を付けることができますServiceName
hostnameホスト名を指定します
portWeb サービスポート

実例

次に、上記の手順に従って、独立したサービスを作成します:

実例

require "soap/rpc/standaloneserver" begin class MyServer < SOAP::RPC::StandaloneServer # Expose our service def initialize(*args) add_method(self, 'add', 'a', 'b') add_method(self, 'div', 'a', 'b') end # Handler methods def add(a, b) return a + b end def div(a, b) return a / b end end server = MyServer.new("MyServer", 'urn:ruby:calculation', 'localhost', 8080) trap('INT){ server.shutdown } server.start rescue => err puts err.message end

上記のプログラムを実行すると、ポート 8080 を監視するローカルサービスが起動し、add と div の2つのメソッドが公開されます。

上記のサービスをバックグラウンドで実行できます:

$ ruby MyServer.rb &

SOAP4R クライアント

Ruby では、SOAP::RPC::Driver クラスを使用して SOAP クライアントを開発します。次に、SOAP::RPC::Driver クラスの使用方法を詳しく見ていきましょう。

SOAP サービスを呼び出すには、以下の情報が必要です:

  • SOAP サービスの URL アドレス (SOAP Endpoint URL)
  • サービスメソッドの名前空間(Method Namespace URI)
  • サービスメソッド名とパラメータ情報

次に、ステップバイステップで SOAP クライアントを作成し、上記の SOAP メソッド add、div を呼び出してみましょう:

ステップ1 - SOAP Driver インスタンスを作成

SOAP::RPC::Driver クラスをインスタンス化することで、その新しいメソッドを呼び出すことができます。以下のようになります:

SOAP::RPC::Driver.new(endPoint, nameSpace, soapAction)

パラメータの説明は以下のとおりです:

パラメータ説明
endPointSOAP サービスに接続する URL アドレス
nameSpaceSOAP::RPC::Driver オブジェクトのすべての RPC に使用される名前空間。
soapActionHTTP ヘッダーの SOAPAction フィールド値に使用されます。文字列が "" の場合、デフォルトはnil

ステップ2 - サービスメソッドを追加

SOAP::RPC::Driver に SOAP サービスメソッドを追加するには、SOAP::RPC::Driver のインスタンスを使用して以下のメソッドを呼び出します:

driver.add_method(name, *paramArg)

パラメータの説明は以下のとおりです:

パラメータ説明
nameリモート Web サービスのメソッド名
paramArgリモートプログラムのパラメータを指定します

ステップ3 - SOAPサービスを呼び出す

最後に、SOAP::RPC::Driver インスタンスを使用して SOAP サービスを呼び出すことができます:

result = driver.serviceMethod(paramArg...)

serviceMethod は SOAP サービスの実際のメソッド名で、paramArg はメソッドのパラメータリストです。

実例

上記の手順に基づいて、以下の SOAP クライアントを作成できます:

実例

#!/usr/bin/ruby -w require 'soap/rpc/driver' NAMESPACE = 'urn:ruby:calculation' URL = 'http://localhost:8080/' begin driver = SOAP::RPC::Driver.new(URL, NAMESPACE) # Add remote sevice methods driver.add_method('add', 'a', 'b') # Call remote service methods puts driver.add(20, 30) rescue => err puts err.message end

以上、Ruby の Web Service について簡単に紹介しました。さらに詳しく知りたい場合は、公式ドキュメントを参照してください:Ruby の Web Service

その他の拡張