English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
シンプルオブジェクトアクセスプロトコル(SOAP、Simple Object Access Protocolの略)はデータ交換のためのプロトコル規格です。
SOAPはシンプルなXMLに基づくプロトコルで、アプリケーションがHTTPを通じて情報を交換するために使用されます。
シンプルオブジェクトアクセスプロトコルはデータ交換のためのプロトコル規格であり、軽量でシンプルなXML(標準一般マークアップ言語の一部)に基づくプロトコルで、ウェブ上での構造化された固定情報の交換に設計されています。
SOAP4RはHiroshi Nakamuraによって開発・実装され、RubyのSOAPアプリケーションに使用されます。
SOAP4Rのダウンロード先:http://raa.ruby-lang.org/project/soap4r/。
注意:あなたのRuby環境には、既にこのコンポーネントがインストールされている可能性があります。
Linux環境では、以下のコマンドを使用してこのコンポーネントをインストールできます:
gem install soap4r --include-依存関係
Windows環境で開発している場合は、zip圧縮ファイルをダウンロードし、install.rbを実行してインストールする必要があります。
SOAP4Rは2つの異なるサービスタイプをサポートしています:
CGIに基づく/FastCGI サービス (SOAP::RPC::CGIStub)
独立サービス (SOAP::RPC:StandaloneServer)
このチュートリアルでは、独立した SOAP サービスを構築する方法を紹介します。以下のステップで構成されています:
独自のサーバーを実現するために、新しいクラスを書く必要があります。このクラスは SOAP::RPC::StandaloneServerのサブクラスです:
class MyServer < SOAP::RPC::StandaloneServer ............. end
注意:FastCGIサーバーを書く場合は、SOAP::RPC::CGIStubクラスを継承する必要があります。プログラムの残りは変更されません。
次に、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
次に、サーバー上で定義したメソッドを追加します。initialize メソッドは公開であり、外部の接続に使用されます:
class MyServer < SOAP::RPC::StandaloneServer def initialize(*args) add_method(receiver, inoutParam, *paramArg) end end
以下は各パラメータの説明です:
パラメータ | 説明 |
---|---|
receiver | メソッド名を含むオブジェクト。同じクラス内でサービスメソッドを定義する場合、このパラメータは self。 |
methodName | RPC リクエストのメソッド名を呼び出します。 |
paramArg | パラメータ名とパラメータモード |
理解するためには inout および out パラメータ、以下のサービスメソッドを考慮し、2つのパラメータ: inParam と inoutParam を入力する必要があります。関数が実行されると、3つの値が返されます:retVal、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) ])
最後に、派生クラスを例示し、startメソッドを呼び出してサービスを起動します:
myServer = MyServer.new('ServerName', 'urn:ruby:ServiceName', hostname, port) myServer.start
以下はリクエストパラメータの説明です:
パラメータ | 説明 |
---|---|
ServerName | サービス名を設定します。好きな名前を指定できます。 |
urn:ruby:ServiceName | ここでは urn:ruby は固定ですが、あなたのサービスにユニークな名前を付けることができます。 ServiceName |
hostname | ホスト名を指定 |
port | ウェブサービスのポート |
次に、以下の手順で独立したサービスを作成します:
require "soap/rpc/standaloneserver" begin class MyServer < SOAP::RPC::StandaloneServer # サービスを公開 def initialize(*args) add_method(self, 'add', 'a', 'b') add_method(self, 'div', 'a', 'b') end # ハンドラメソッド 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 &
rubyでSOAP::RPC::Driverクラスを使用してSOAPクライアントを開発します。次に、SOAP::RPC::Driverクラスの使用方法について詳しく見ていきましょう。
SOAPサービスの呼び出しには以下の情報が必要です:
SOAPサービスのURLアドレス(SOAP Endpoint URL)
サービスメソッドの名前空間(Method Namespace URI)
サービスメソッド名及び引数情報
次に、以下のSOAPメソッドを呼び出すためにSOAPクライアントを作成する手順を一つずつ説明します:add、div:
SOAP::RPC::Driverクラスをインスタンス化して新しいメソッドを呼び出すことができます。以下のように示します:
SOAP::RPC::Driver.new(endPoint, nameSpace, soapAction)
以下はパラメータの説明です:
パラメータ | 説明 |
---|---|
endPoint | SOAPサービスのURLアドレス |
nameSpace | nameSpaceはSOAP::RPC::DriverオブジェクトのすべてのRPCに使用される名前空間です。 |
soapAction | HTTPヘッダのSOAPActionフィールドの値として使用されます。文字列が""の場合はデフォルトで nil |
SOAP::RPC::DriverにSOAPサービスメソッドを追加し、以下の例のSOAP::RPC::Driverを使用して以下のメソッドを呼び出すことができます:
driver.add_method(name, *paramArg)
以下はパラメータの説明です:
パラメータ | 説明 |
---|---|
name | リモートwebサービスのメソッド名 |
paramArg | リモートプログラムのパラメータを指定 |
最後に、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サービスについて簡単に紹介しました。 もっと詳しく知りたい場合は、公式ドキュメントを確認してください:RubyのWebサービス