XML-RPC: ejemplos

Para demostrar XML-RPC, crearemos un servidor que usa Java para procesar mensajes XML-RPC, y crearemos un cliente Java para llamar a procedimientos en ese servidor.

El lado Java de la conversación utiliza Apache XML-RPC del Proyecto XML de Apache, disponible en http://xml.apache.org/xmlrpc/

Coloque todos los archivos .jar en la ruta adecuada y permítanos crear un cliente y un pequeño servidor XML-RPC usando JAVA.

Cliente XML-RPC

Escribamos un cliente XML-RPC para llamar a una función llamada función suma . Esta función toma dos parámetros y devuelve su suma.

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);
      }
   }
}

Veamos qué ha sucedido en el cliente de ejemplo anterior.

  • El paquete Java org.apache.xmlrpc contiene clases para clientes Java XML-RPC y servidor XML-RPC, por ejemplo, XmlRpcClient.

  • El paquete java.util es necesario para la clase Vector.

  • La función server.execute (...) envía la solicitud al servidor. La suma del procedimiento (17,13) se llama en el servidor como si fuera un procedimiento local. El valor de retorno de una llamada a procedimiento es siempre un objeto.

  • Aquí "muestra" denota un controlador que está definido en el servidor.

  • Tenga en cuenta que todos los parámetros de la llamada al procedimiento siempre se recopilan en un vector.

  • La clase XmlRpcClient se construye especificando la "dirección web" de la máquina servidor seguida de / RPC2.

    • localhost - significa la máquina local

    • Puede especificar un número de IP en lugar de localhost, por ejemplo, 194.80.215.219

    • Puede especificar un nombre de dominio como xyz.dyndns.org

    • Puede especificar un número de puerto junto con el nombre de dominio como xyz.dyndns.org:8080. El puerto predeterminado es 80

  • Tenga en cuenta que el resultado de la llamada al procedimiento remoto es siempre un Objeto y debe convertirse en el tipo apropiado.

  • Cuando ocurren problemas (sin conexión, etc.), se lanza una excepción y debe detectarse mediante la instrucción catch .

Debido a la llamada anterior, un cliente envía el siguiente mensaje al servidor. Tenga en cuenta que esto lo maneja server.execute (...) internamente y no tiene nada que ver con él.

<?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>

Servidor XML-RPC

A continuación se muestra el código fuente del servidor XML-RPC escrito en Java. Hace uso de clases integradas disponibles en 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);
      }
   }
}

Veamos qué hemos hecho en el servidor de ejemplo anterior.

  • El paquete org.apache.xmlrpc contiene la clase WebServer para una implementación de servidor XML-RPC.

  • La suma del procedimiento que se llama de forma remota se implementa como un método público en una clase.

  • A continuación, se asocia una instancia de la misma clase de servidor con un controlador al que puede acceder el cliente.

  • El servidor se inicializa con el número de puerto (aquí: 80).

  • Cuando ocurren problemas, se lanza una excepción y debe detectarse mediante la instrucción catch .

Para la llamada mencionada en el cliente de ejemplo dado, el servidor envía la siguiente respuesta al cliente:

<?xml version="1.0" encoding="ISO-8859-1"?>
<methodResponse>
   <params>
      <param>
         <value><int>30</int></value>
      </param>
   </params>
</methodResponse>

Ahora que su servidor está listo, compílelo y ejecútelo cuando se le solicite de la siguiente manera:

C:\ora\xmlrpc\java>java JavaServer
Attempting to start XML-RPC Server...
Started successfully.
Accepting requests. (Halt program to stop.)

Ahora, para probar la funcionalidad, llame a este servidor de la siguiente manera:

C:\ora\xmlrpc\java>java JavaClient
30