XML-RPC - Exemplos

Para demonstrar XML-RPC, vamos criar um servidor que usa Java para processar mensagens XML-RPC e vamos criar um cliente Java para chamar procedimentos nesse servidor.

O lado Java da conversa usa o Apache XML-RPC do Projeto Apache XML, disponível em http://xml.apache.org/xmlrpc/

Coloque todos os arquivos .jar no caminho apropriado e vamos criar um cliente e um pequeno servidor XML-RPC usando JAVA.

Cliente XML-RPC

Vamos escrever um cliente XML-RPC para chamar uma função chamada função soma . Esta função recebe dois parâmetros e retorna sua soma.

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

Vamos ver o que aconteceu no cliente de exemplo acima.

  • O pacote Java org.apache.xmlrpc contém classes para clientes XML-RPC Java e servidor XML-RPC, por exemplo, XmlRpcClient.

  • O pacote java.util é necessário para a classe Vector.

  • A função server.execute (...) envia a solicitação para o servidor. A soma do procedimento (17,13) é chamada no servidor como se fosse um procedimento local. O valor de retorno de uma chamada de procedimento é sempre um objeto.

  • Aqui, "amostra" denota um manipulador que é definido no servidor.

  • Observe que todos os parâmetros da chamada de procedimento são sempre coletados em um Vetor.

  • A classe XmlRpcClient é construída especificando o "endereço da web" da máquina do servidor seguido por / RPC2.

    • localhost - significa a máquina local

    • Você pode especificar um número de IP em vez de localhost, por exemplo, 194.80.215.219

    • Você pode especificar um nome de domínio como xyz.dyndns.org

    • Você pode especificar um número de porta junto com o nome de domínio como xyz.dyndns.org:8080. A porta padrão é 80

  • Observe que o resultado da chamada de procedimento remoto é sempre um objeto e deve ser convertido para o tipo apropriado.

  • Quando ocorrem problemas (sem conexão, etc.), uma Exceção é lançada e deve ser capturada usando a instrução catch .

Devido à chamada acima, um cliente envia a seguinte mensagem ao servidor. Observe que isso é tratado por server.execute (...) internamente e você não tem nada a ver com isso.

<?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 seguir está o código-fonte do XML-RPC Server escrito em Java. Ele usa classes integradas disponíveis em 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);
      }
   }
}

Vamos ver o que fizemos no servidor de exemplo acima.

  • O pacote org.apache.xmlrpc contém a classe WebServer para uma implementação de servidor XML-RPC.

  • A soma do procedimento que é chamada remotamente é implementada como um método público em uma classe.

  • Uma instância da mesma classe de servidor é então associada a um manipulador que pode ser acessado pelo cliente.

  • O servidor é inicializado pelo número da porta (aqui: 80).

  • Quando ocorrem problemas, uma exceção é lançada e deve ser detectada usando a instrução catch .

Para a chamada mencionada no cliente de exemplo fornecido, o servidor envia a seguinte resposta de volta ao cliente:

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

Agora seu servidor está pronto, compile-o e execute-o no prompt da seguinte maneira:

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

Agora, para testar a funcionalidade, faça uma chamada para este servidor da seguinte maneira:

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