XML-RPC のサーバとクライアント、両方をサポートする標準添付ライブラリです。
XML-RPC は Web API によるネットワーク越しのマシン間のやりとりを実現する最も簡単な方法の1つです。
Web API とはネットワークを越えたマシンに何らかの処理を依頼するためのインターフェイスです。
マシン間のネットワーク上でのやりとりは HTTP および XML の技術を使って実現されていますが、この xmlrpc モジュールのおかげでプログラマがそれを意識する必要はほとんどありません。
xmlrpc モジュールによる XML-RPC の Web API は、Ruby の標準添付モジュールだけで実現可能であり、非常に簡単に作れるのが特徴です。
概要
xmlrpc モジュールを使ってサーバやクライアントを作る方法の簡単な説明と、実用する際の注意点/カスタマイズ方法などについてまとめます。
最も簡単なサーバとクライアントの例
まずはコードと動かし方について説明し、その後、細かい部分を解説します。
サーバ(server.rb)
# coding: UTF-8 # server.rb require 'xmlrpc/server' # XML-RPC のメソッドを定義する。 # 足し算と割り算の2つの機能を提供する。 class Calculator INTERFACE = XMLRPC::interface("calculator") { meth 'int add(int, int)', 'Add two numbers' meth 'int div(int, int)', 'Divide two numbers' } def add(a, b) a + b end def div(a, b) a / b end end # サーバを作成し、Calculator インターフェイスを登録する。 server = XMLRPC::Server.new(8080) server.add_handler(Calculator::INTERFACE, Calculator.new) # サーバを起動する server.serve
クライアント(client.rb)
# coding: UTF-8 # client.rb require 'xmlrpc/client' value1 = 5 value2 = 3 server = XMLRPC::Client.new("localhost", "/", 8080) result = server.call("calculator.add", value1, value2) puts "#{value1} + #{value2} = #{result}"
動かし方
- コンソールを2つ開きます。
- 1つ目のコンソールでサーバを動かします。
- ruby server.rb
- 2つ目のコンソールでクライアントを動かします。
- ruby client.rb
client.rb を動かした結果として以下の出力が得られるはずです。
5 + 3 = 8
また、server.rb には色々とログが出ているはずです。これで成功です。
解説
サーバ
xmlrpc モジュールを使ったXML-RPC のサーバにはいくつかの実装方法があります*1が、その中でも厳格と思われる方法をここでは採用しました*2。
まず最初に Calculator クラスの定義をしています。このクラスは、XML-RPC インターフェイスを通して呼び出される機能の実態です。作り方のポイントを以下にまとめます。
- XMLRPC::interface を使って INTERFACE 定数を定義します(※ INTERFACE という定数の名前は慣習であり、INTERFACE という名前で無ければならないという制約はありません)。
- 外部から呼び出す際のオブジェクト名を定義します。
- XMLRPC::interface("calculator") の "calculator" がオブジェクト名です。
- 外部から呼び出し可能なメソッド名を定義します。
- meth メソッドを使って定義します。第1引数はメソッドのシグネチャ、第2引数はメソッドの説明です。
- 外部から呼び出す際のオブジェクト名を定義します。
- 実際にメソッドを定義します。
- 通常のメソッドとして定義して大丈夫です。
その後、XML-RPC サーバの実態である XMLRPC::Server オブジェクトを作成し、Calculator オブジェクトを登録し、serve メソッドでサーバを起動します。
サーバを起動した時点で server.rb は外部からの通信要求待ちに入り、プログラムは常時稼動状態に入ります。
サーバを止めるには SIGHUP シグナルを送ってください(と Ruby のドキュメントには書いてありますが、サーバを止めるタイミングをコントロールする方法については別途解説します)。
クライアント
クライアントはサーバに接続してメソッドを呼び出すだけなのでとても簡単です。
XMLRPC::Client オブジェクトの call メソッドでサーバの機能を呼び出せます。
第1引数は、機能の名前です。第2引数以降は、サーバの提供する機能に必要となる任意の引数を指定します。
個別話題
サーバ
事例では XMLRPC::Server クラスをサーバとして使いましたが、その他に XMLRPC::CGIServer, XMLRPC::ModRubyServer があります。
それぞれの違いと、選択のポイントを説明します。
XMLRPC::Server クラスを使ったサーバを止めるタイミングをコントロールする方法について説明します。
XMLRPC::Server クラスは標準出力と標準エラー出力にログを出力します。このログ出力先を変更する方法について説明します。
XMLRPC::Server クラスを使って Sinatra 上に XML-RPC エントリポイントを構築する方法について説明します。
クライアント
コメント
本ページの内容に関して何かコメントがある方は、以下に記入してください。
コメントはありません。 コメント/xmlrpc/about