XML-RPC-例
XML-RPCを示すために、Javaを使用してXML-RPCメッセージを処理するサーバーを作成し、そのサーバー上のプロシージャを呼び出すJavaクライアントを作成します。
会話のJava側では、ApacheXMLプロジェクトのApacheXML-RPCを使用します。 http://xml.apache.org/xmlrpc/
すべての.jarファイルを適切なパスに配置し、JAVAを使用して1つのクライアントと1つの小さなXML-RPCサーバーを作成しましょう。
XML-RPCクライアント
sum関数と呼ばれる関数を呼び出すXML-RPCクライアントを作成してみましょう。この関数は2つのパラメーターを受け取り、それらの合計を返します。
import java.util.*;
import org.apache.xmlrpc.*;
public class JavaClient {
public static void main (String [] args) {
try {
XmlRpcClient client = new XmlRpcClient("http://localhost/RPC2");
Vector params = new Vector();
params.addElement(new Integer(17));
params.addElement(new Integer(13));
Object result = server.execute("sample.sum", params);
int sum = ((Integer) result).intValue();
System.out.println("The sum is: "+ sum);
} catch (Exception exception) {
System.err.println("JavaClient: " + exception);
}
}
}
上記のサンプルクライアントで何が起こったかを見てみましょう。
Javaパッケージorg.apache.xmlrpcには、XML-RPC JavaクライアントおよびXML-RPCサーバー(XmlRpcClientなど)のクラスが含まれています。
Vectorクラスにはパッケージjava.utilが必要です。
関数server.execute(...)は、サーバーに要求を送信します。プロシージャsum(17,13)は、ローカルプロシージャであるかのようにサーバー上で呼び出されます。プロシージャコールの戻り値は常にオブジェクトです。
ここで、「サンプル」はサーバーで定義されているハンドラーを示します。
プロシージャコールのすべてのパラメータは常にVectorに収集されることに注意してください。
XmlRpcClientクラスは、サーバーマシンの「Webアドレス」に続いて/ RPC2を指定することによって構築されます。
localhost-ローカルマシンを意味します
ローカルホストの代わりにIP番号を指定できます(例:194.80.215.219)
xyz.dyndns.orgのようなドメイン名を指定できます
ポート番号とドメイン名をxyz.dyndns.org:8080として指定できます。デフォルトのポートは80です
リモートプロシージャコールの結果は常にオブジェクトであり、適切なタイプにキャストする必要があることに注意してください。
問題が発生した場合(接続がないなど)、例外がスローされ、catchステートメントを使用してキャッチする必要があります。
上記の呼び出しにより、クライアントは次のメッセージをサーバーに送信します。これはserver.execute(...)によって内部的に処理され、関係がないことに注意してください。
<?xml version="1.0" encoding="ISO-8859-1"?>
<methodCall>
<methodName>sample.sum</methodName>
<params>
<param>
<value><int>17</int></value>
</param>
<param>
<value><int>13</int></value>
</param>
</params>
</methodCall>
XML-RPCサーバー
以下は、Javaで記述されたXML-RPCサーバーのソースコードです。org.apache.xmlrpc。*で利用可能な組み込みクラスを利用します。
import org.apache.xmlrpc.*;
public class JavaServer {
public Integer sum(int x, int y){
return new Integer(x+y);
}
public static void main (String [] args){
try {
System.out.println("Attempting to start XML-RPC Server...");
WebServer server = new WebServer(80);
server.addHandler("sample", new JavaServer());
server.start();
System.out.println("Started successfully.");
System.out.println("Accepting requests. (Halt program to stop.)");
} catch (Exception exception){
System.err.println("JavaServer: " + exception);
}
}
}
上記のサンプルサーバーで何をしたかを見てみましょう。
パッケージorg.apache.xmlrpcには、XML-RPCサーバー実装用のクラスWebServerが含まれています。
リモートで呼び出されるプロシージャsumは、クラスのパブリックメソッドとして実装されます。
次に、同じサーバークラスのインスタンスが、クライアントがアクセスできるハンドラーに関連付けられます。
サーバーはポート番号(ここでは80)で初期化されます。
問題が発生すると、例外がスローされ、catchステートメントを使用してキャッチする必要があります。
指定されたクライアントの例で説明されている呼び出しの場合、サーバーは次の応答をクライアントに送り返します。
<?xml version="1.0" encoding="ISO-8859-1"?>
<methodResponse>
<params>
<param>
<value><int>30</int></value>
</param>
</params>
</methodResponse>
これでサーバーの準備ができたので、次のようにプロンプトでコンパイルして実行します。
C:\ora\xmlrpc\java>java JavaServer
Attempting to start XML-RPC Server...
Started successfully.
Accepting requests. (Halt program to stop.)
機能をテストするには、次のようにこのサーバーを呼び出します。
C:\ora\xmlrpc\java>java JavaClient
30