Rubyを使用したWebサービス-SOAP4R
SOAPとは何ですか?
Simple Object Access Protocol(SOAP)は、クロスプラットフォームで言語に依存しないRPCプロトコルであり、XMLと、通常は(必ずしもそうとは限りませんが)HTTPに基づいています。
XMLを使用してリモートプロシージャコールを行う情報をエンコードし、HTTPを使用してその情報をネットワーク経由でクライアントからサーバーに(またはその逆に)転送します。
SOAPには、COM、CORBAなどの他のテクノロジに比べていくつかの利点があります。たとえば、比較的安価な展開とデバッグのコスト、拡張性と使いやすさ、さまざまな言語とプラットフォーム用のいくつかの実装の存在などです。
詳細については、簡単なチュートリアルSOAPを参照してください。
この章では、RubyのSOAP実装(SOAP4R)について理解します。これは基本的なチュートリアルであるため、詳細が必要な場合は、他のリソースを参照する必要があります。
SOAP4Rのインストール
SOAP4Rは、中村宏によって開発されたRubyのSOAP実装であり、-からダウンロードできます。
NOTE −このコンポーネントをすでにインストールしている可能性が高いです。
Download SOAP
あなたが知っているなら gem ユーティリティの場合、次のコマンドを使用して、SOAP4Rおよび関連パッケージをインストールできます。
$ 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 :: StandaloneServerの子となる新しいクラスを次のように作成する必要があります。
class MyServer < SOAP::RPC::StandaloneServer
...............
end
NOTE− FastCGIベースのサーバーを作成する場合は、SOAP :: RPC :: CGIStubを親クラスとして使用する必要があります。残りの手順は同じままです。
ステップ2-ハンドラーメソッドを定義する
2番目のステップは、外部に公開したいWebサービスメソッドを作成することです。
それらは単純なRubyメソッドとして書くことができます。たとえば、2つの数値を加算し、2つの数値を除算する2つのメソッドを記述してみましょう-
class MyServer < SOAP::RPC::StandaloneServer
...............
# Handler methods
def add(a, b)
return a + b
end
def div(a, b)
return a / b
end
end
ステップ3-ハンドラメソッドを公開する
次のステップは、定義したメソッドをサーバーに追加することです。初期化方法は、次の二つの方法のいずれかでサービスメソッドを公開するために使用されます-
class MyServer < SOAP::RPC::StandaloneServer
def initialize(*args)
add_method(receiver, methodName, *paramArg)
end
end
パラメータの説明は次のとおりです-
シニア番号 | パラメータと説明 |
---|---|
1 | receiver methodNameメソッドを含むオブジェクト。methodDefメソッドと同じクラスでサービスメソッドを定義します。このパラメーターはselfです。 |
2 | methodName RPC要求のために呼び出されるメソッドの名前。 |
3 | paramArg 指定されている場合は、パラメーター名とパラメーターモードを指定します。 |
inoutまたはoutパラメーターの使用法を理解するために、2つのパラメーター(inParamおよびinoutParam)を取り、1つの通常の戻り値(retVal)と2つの追加パラメーターを返す次のサービスメソッドを検討してください:inoutParamおよびoutParam −
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-サーバーを起動します
最後のステップは、派生クラスの1つのインスタンスをインスタンス化し、を呼び出すことによってサーバーを起動することです。 start 方法。
myServer = MyServer.new('ServerName', 'urn:ruby:ServiceName', hostname, port)
myServer.start
必要なパラメータの説明は次のとおりです-
シニア番号 | パラメータと説明 |
---|---|
1 | ServerName サーバー名、あなたはあなたが最も好きなものを与えることができます。 |
2 | urn:ruby:ServiceName ここでurn:rubyは定数ですが、このサーバーに一意のServiceName名を付けることができます。 |
3 | hostname このサーバーがリッスンするホスト名を指定します。 |
4 | port Webサービスに使用できる使用可能なポート番号。 |
例
ここで、上記の手順を使用して、1つのスタンドアロンサーバーを作成しましょう-
require "soap/rpc/standaloneserver"
begin
class MyServer < SOAP::RPC::StandaloneServer
# Expose our services
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
実行されると、このサーバーアプリケーションはローカルホストでスタンドアロンSOAPサーバーを起動し、ポート8080で要求をリッスンします。2つのパラメーターを取り、結果を返す1つのサービスメソッドaddとdivを公開します。
これで、次のようにこのサーバーをバックグラウンドで実行できます。
$ ruby MyServer.rb&
SOAP4Rクライアントの作成
SOAP :: RPC ::ドライバー・クラスは、SOAPクライアントアプリケーションを記述するためのサポートを提供します。この章では、このクラスについて説明し、アプリケーションに基づいてその使用法を示します。
以下は、SOAPサービスを呼び出すために必要な最低限の情報です。
- SOAPサービスのURL(SOAPエンドポイントURL)。
- サービスメソッドの名前空間(メソッド名前空間URI)。
- サービスメソッドの名前とそのパラメータ。
ここで、上記の例で定義されたaddおよびdivという名前のサービスメソッドを呼び出すSOAPクライアントを作成します。
SOAPクライアントを作成するための主な手順は次のとおりです。
ステップ1-SOAPドライバーインスタンスを作成する
次のように新しいメソッドを呼び出すことにより、SOAP :: RPC :: Driverのインスタンスを作成します-
SOAP::RPC::Driver.new(endPoint, nameSpace, soapAction)
必要なパラメータの説明は次のとおりです-
シニア番号 | パラメータと説明 |
---|---|
1 | endPoint 接続するSOAPサーバーのURL。 |
2 | nameSpace このSOAP :: RPC :: Driverオブジェクトで実行されるすべてのRPCに使用する名前空間。 |
3 | soapAction HTTPヘッダーのSOAPActionフィールドの値。nilの場合、これはデフォルトで空の文字列 ""になります。 |
ステップ2-サービスメソッドを追加する
SOAPサービスメソッドをSOAP :: RPC :: Driverに追加するには、SOAP :: RPC :: Driverインスタンスを使用して次のメソッドを呼び出すことができます。
driver.add_method(name, *paramArg)
パラメータの説明は次のとおりです-
シニア番号 | パラメータと説明 |
---|---|
1 | name リモートWebサービスメソッドの名前。 |
2 | paramArg リモートプロシージャのパラメータの名前を指定します。 |
ステップ3-SOAPサービスを呼び出す
最後のステップは、SOAP :: RPC :: Driverインスタンスを使用してSOAPサービスに次のように請求することです。
result = driver.serviceMethod(paramArg...)
ここで、serviceMethodは実際のWebサービスメソッドであり、paramArg ...はサービスメソッドを渡すために必要なリストパラメーターです。
Example
上記の手順に基づいて、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サービスの非常に基本的な概念について説明しました。さらにドリルダウンしたい場合は、Rubyを使用したWebサービスの詳細を見つけるための次のリンクがあります。