XML-RPC - 示例

为了演示 XML-RPC,我们将创建一个使用 Java 处理 XML-RPC 消息的服务器,并创建一个 Java 客户端来调用该服务器上的过程。

对话的 Java 端使用 Apache XML 项目的 Apache XML-RPC,可从 http://xml.apache.org/xmlrpc/

获取

将所有 .jar 文件放在适当的路径中,然后使用 JAVA 创建一个客户端和一个小型 XML-RPC 服务器。

XML-RPC 客户端

让我们编写一个 XML-RPC 客户端来调用一个名为 sum 的函数。此函数接受两个参数并返回它们的和。

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。

  • 包 java.util 是 Vector 类所必需的。

  • 函数 server.execute(...) 将请求发送到服务器。在服务器上调用过程 sum(17,13),就像它是一个本地过程一样。过程调用的返回值始终是一个对象。

  • 此处的"sample"表示在服务器中定义的处理程序。

  • 请注意,过程调用的所有参数始终收集在 Vector 中。

  • XmlRpcClient 类是通过指定服务器计算机的"Web 地址"后跟 /RPC2 来构造的。

    • localhost - 表示本地计算机

    • 您可以指定 IP 号而不是 localhost,例如 194.80.215.219

    • 您可以指定域名,如 xyz.dyndns.org

    • 您可以指定端口号以及域名,如 xyz.dyndns.org:8080。默认端口为 80

  • 请注意,远程过程调用的结果始终是 Object,必须将其转换为适当的类型。

  • 当出现问题(无连接等)时,会引发异常,必须使用 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