XML-RPC - Guía rápida

RPC significa llamada a procedimiento remoto. Como su nombre lo indica, es un mecanismo para llamar a un procedimiento o función disponible en una computadora remota. RPC es una tecnología mucho más antigua que la Web. Efectivamente, RPC brinda a los desarrolladores un mecanismo para definir interfaces que se pueden llamar a través de una red. Estas interfaces pueden ser tan simples como una sola llamada a una función o tan complejas como una API grande.

¿Qué es XML-RPC?

XML-RPC se encuentra entre los enfoques de servicios web más simples e infalibles que facilita a las computadoras llamar a procedimientos en otras computadoras.

  • XML-RPC permite a los programas realizar llamadas a funciones o procedimientos a través de una red.

  • XML-RPC usa el protocolo HTTP para pasar información de una computadora cliente a una computadora servidor.

  • XML-RPC utiliza un pequeño vocabulario XML para describir la naturaleza de las solicitudes y respuestas.

  • El cliente XML-RPC especifica un nombre de procedimiento y parámetros en la solicitud XML, y el servidor devuelve un error o una respuesta en la respuesta XML.

  • Los parámetros XML-RPC son una lista simple de tipos y contenido; las estructuras y las matrices son los tipos más complejos disponibles.

  • XML-RPC no tiene noción de objetos ni mecanismo para incluir información que utilice otro vocabulario XML.

  • Sin embargo, con XML-RPC y los servicios web, la web se convierte en una colección de conexiones de procedimiento donde las computadoras intercambian información a lo largo de rutas estrechamente vinculadas.

  • XML-RPC surgió a principios de 1998; fue publicado por UserLand Software e inicialmente implementado en su producto Frontier.

¿Por qué XML-RPC?

Si necesita integrar varios entornos informáticos, pero no necesita compartir estructuras de datos complejas directamente, encontrará que XML-RPC le permite establecer comunicaciones de forma rápida y sencilla.

Incluso si trabaja dentro de un solo entorno, puede encontrar que el enfoque RPC facilita la conexión de programas que tienen diferentes modelos de datos o expectativas de procesamiento y que puede proporcionar un fácil acceso a la lógica reutilizable.

  • XML-RPC es una excelente herramienta para establecer una amplia variedad de conexiones entre computadoras.

  • XML-RPC ofrece a los integradores la oportunidad de utilizar un vocabulario y un enfoque estándar para intercambiar información.

  • El campo de aplicación más obvio de XML-RPC es la conexión de diferentes tipos de entornos, lo que permite que Java se comunique con Perl, Python, ASP, etc.

Descripción general técnica de XML-RPC

XML-RPC consta de tres partes relativamente pequeñas:

  • XML-RPC data model : Un conjunto de tipos para usar en el paso de parámetros, valores de retorno y fallas (mensajes de error).

  • XML-RPC request structures : Una solicitud HTTP POST que contiene información sobre métodos y parámetros.

  • XML-RPC response structures : Una respuesta HTTP que contiene valores de retorno o información de error.

Estudiaremos estos tres componentes en los próximos tres capítulos.

La especificación XML-RPC define seis tipos de datos básicos y dos tipos de datos compuestos que representan combinaciones de tipos.

Tipos de datos básicos en XML-RPC

Tipo Valor Ejemplos
int o i4 Enteros de 32 bits entre - 2,147,483,648 y 2,147,483,647.

<int> 27 </int>

<i4> 27 </i4>

doble Números de coma flotante de 64 bits

<double> 27.31415 </double>

<double> -1.1465 </double>

Booleano verdadero (1) o falso (0)

<boolean> 1 </boolean>

<boolean> 0 </boolean>

cuerda Texto ASCII, aunque muchas implementaciones admiten Unicode

<string> Hola </string>

<string> ¡locos! @ </string>

dateTime.iso8601 Fechas en formato ISO8601: CCYYMMDDTHH: MM: SS

<dateTime.iso8601>

20021125T02: 20: 04

</dateTime.iso8601>

<dateTime.iso8601>

20020104T17: 27: 30

</dateTime.iso8601>

base64 Información binaria codificada como Base 64, como se define en RFC 2045

<base64> SGVsbG8sIFdvcmxkIQ == </base64>

Estos tipos básicos siempre se incluyen en elementos de valor . Las cadenas (y solo las cadenas) pueden incluirse en un elemento de valor , pero omiten el elemento de cadena . Estos tipos básicos se pueden combinar en dos tipos, matrices y estructuras más complejos. Las matrices representan información secuencial, mientras que las estructuras representan pares nombre-valor, al igual que tablas hash, matrices asociativas o propiedades.

Las matrices se indican mediante el elemento de matriz , que contiene un elemento de datos que contiene la lista de valores. Al igual que otros tipos de datos, el elemento de matriz debe incluirse en un elemento de valor . Por ejemplo, la siguiente matriz contiene cuatro cadenas:

<value>
   <array>
      <data>
         <value><string>This </string></value>
         <value><string>is </string></value>
         <value><string>an </string></value>
         <value><string>array.</string></value>
      </data>
   </array>
</value>

La siguiente matriz contiene cuatro números enteros:

<value>
   <array>
      <data>
         <value><int>7</int></value>
         <value><int>1247</int></value>
         <value><int>-91</int></value>
         <value><int>42</int></value>
      </data>
   </array>
</value>

Las matrices también pueden contener mezclas de diferentes tipos, como se muestra aquí:

<value>
   <array>
      <data>
         <value><boolean>1</boolean></value>
         <value><string>Chaotic collection, eh?</string></value>
         <value><int>-91</int></value>
         <value><double>42.14159265</double></value>
      </data>
   </array>
</value>

Crear matrices multidimensionales es simple: simplemente agregue una matriz dentro de una matriz:

<value>
   <array>
      <data>
		
         <value>
            <array>
               <data>
                  <value><int>10</int></value>
                  <value><int>20</int></value>
                  <value><int>30</int></value>
               </data>
            </array>
         </value>
			
         <value>
            <array>
               <data>
                  <value><int>15</int></value>
                  <value><int>25</int></value>
                  <value><int>35</int></value>
               </data>
            </array>
         </value>
			
      </data>
   </array>
</value>

Una estructura simple podría verse así:

<value>
   <struct>
      <member>
         <name>givenName</name>
         <value><string>Joseph</string></value>
      </member>
		
      <member>
         <name>familyName</name>
         <value><string>DiNardo</string></value>
      </member>
		
      <member>
         <name>age</name>
         <value><int>27</int></value>
      </member>
   </struct>
</value>

De esta forma, puede implementar casi todos los tipos de datos compatibles con cualquier lenguaje de programación.

Las solicitudes XML-RPC son una combinación de contenido XML y encabezados HTTP. El contenido XML utiliza la estructura de escritura de datos para pasar parámetros y contiene información adicional que identifica qué procedimiento se está llamando, mientras que los encabezados HTTP proporcionan un contenedor para pasar la solicitud a través de la Web.

Cada solicitud contiene un único documento XML, cuyo elemento raíz es un elemento methodCall . Cada elemento methodCall contiene un elemento methodName y un elemento params . El elemento methodName identifica el nombre del procedimiento a llamar, mientras que el elemento params contiene una lista de parámetros y sus valores. Cada elemento params incluye una lista de elementos param que a su vez contienen elementos de valor .

Por ejemplo, para pasar una solicitud a un método llamado circleArea , que toma un parámetro Double (para el radio), la solicitud XML-RPC se vería así:

<?xml version="1.0"?>
<methodCall>
   <methodName>circleArea</methodName>
      <params>
         <param>
            <value><double>2.41</double></value>
         </param>
      </params>
</methodCall>

Los encabezados HTTP para estas solicitudes reflejarán los remitentes y el contenido. La plantilla básica tiene el siguiente aspecto:

POST /target HTTP 1.0
User-Agent: Identifier
Host: host.making.request
Content-Type: text/xml
Content-Length: length of request in bytes

Por ejemplo, si el método circleArea estaba disponible desde un servidor XML-RPC que escucha en / xmlrpc , la solicitud podría tener este aspecto:

POST /xmlrpc HTTP 1.0
User-Agent: myXMLRPCClient/1.0
Host: 192.168.124.2
Content-Type: text/xml
Content-Length: 169

Ensamblada, la solicitud completa se vería así:

POST /xmlrpc HTTP 1.0
User-Agent: myXMLRPCClient/1.0
Host: 192.168.124.2
Content-Type: text/xml
Content-Length: 169
<?xml version="1.0"?>
<methodCall>
   <methodName>circleArea</methodName>
      <params>
         <param>
            <value><double>2.41</double></value>
         </param>
      </params>
</methodCall>

Es una solicitud HTTP ordinaria, con una carga útil cuidadosamente construida.

Las respuestas son muy parecidas a las solicitudes, con algunos cambios adicionales. Si la respuesta es exitosa, el procedimiento se encontró, se ejecutó correctamente y arrojó resultados, entonces la respuesta XML-RPC se parecerá mucho a una solicitud, excepto que el elemento methodCall se reemplaza por un elemento methodResponse y no hay ningún elemento methodName :

<?xml version="1.0"?>
<methodResponse>
   <params>
      <param>
         <value><double>18.24668429131</double></value>
      </param>
   </params>
</methodResponse>
  • Una respuesta XML-RPC solo puede contener un parámetro.

  • Ese parámetro puede ser una matriz o una estructura, por lo que es posible devolver varios valores.

  • Siempre es necesario devolver un valor en respuesta. Un "valor de éxito", quizás un valor booleano establecido en verdadero (1).

Al igual que las solicitudes, las respuestas se empaquetan en HTTP y tienen encabezados HTTP. Todas las respuestas XML-RPC utilizan el código de respuesta 200 OK, incluso si el mensaje contiene un error. Los encabezados utilizan una estructura común similar a la de las solicitudes, y un conjunto típico de encabezados podría verse así:

HTTP/1.1 200 OK
Date: Sat, 06 Oct 2001 23:20:04 GMT
Server: Apache.1.3.12 (Unix)
Connection: close
Content-Type: text/xml
Content-Length: 124
  • XML-RPC solo requiere compatibilidad con HTTP 1.0, pero HTTP 1.1 es compatible.

  • El tipo de contenido debe establecerse en texto / xml.

  • El encabezado Content-Length especifica la longitud de la respuesta en bytes.

Una respuesta completa, con encabezados y una carga útil de respuesta, se vería así:

HTTP/1.1 200 OK
Date: Sat, 06 Oct 2001 23:20:04 GMT
Server: Apache.1.3.12 (Unix)
Connection: close
Content-Type: text/xml
Content-Length: 124

<?xml version="1.0"?>
<methodResponse>
   <params>
      <param>
         <value><double>18.24668429131</double></value>
      </param>
   </params>
</methodResponse>

Una vez que se envía la respuesta desde el servidor XML-RPC al cliente XML-RPC, se cierra la conexión. Las solicitudes de seguimiento deben enviarse como conexiones XML-RPC independientes.

Las fallas XML-RPC son un tipo de respuestas. Si hubo un problema al procesar una solicitud XML-RPC, el elemento methodResponse contendrá un elemento de error en lugar de un elemento params. El elemento de falla, como el elemento params , tiene un solo valor que indica que algo salió mal. Una respuesta de falla puede verse así:

<?xml version="1.0"?>
<methodResponse>
   <fault>
      <value><string>No such method!</string></value>
   </fault>
</methodResponse>

Una falla también tendrá un código de error. XML-RPC no estandariza los códigos de error en absoluto. Deberá consultar la documentación de paquetes particulares para ver cómo manejan las fallas.

Una respuesta de falla también podría verse así:

<?xml version="1.0"?>
<methodResponse>
   <fault>
      <value>
         <struct>
            <member>
               <name>code</name>
               <value><int>26</int></value>
            </member>
				
            <member>
               <name>message</name>
               <value><string>No such method!</string></value>
            </member>
				
         </struct>
      </value>
   </fault>
</methodResponse>

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

En este tutorial, ha aprendido qué es XML-RPC y por qué necesitamos XML-RPC. Hemos hablado sobre su modelo de datos, así como el formato de mensaje de solicitud y respuesta que se intercambiará entre el cliente y el servidor. Hemos dado un ejemplo para demostrar cómo funcionan el cliente y el servidor XML-RPC para intercambiar información.

XML-RPC es un concepto muy simple con un conjunto limitado de capacidades. Esas limitaciones son, en muchos sentidos, la característica más atractiva de XML-RPC, ya que reducen sustancialmente la dificultad de implementar el protocolo y probar su interoperabilidad.

Si bien XML-RPC es simple, la aplicación creativa de herramientas simples puede crear arquitecturas sofisticadas y poderosas. En los casos en los que una amplia variedad de sistemas diferentes necesitan comunicarse, XML-RPC puede ser el mínimo común denominador más apropiado.

¿Que sigue?

El siguiente paso es aprender WSDL y SOAP.

WSDL

WSDL es un lenguaje basado en XML para describir los servicios web y cómo acceder a ellos.

WSDL describe un servicio web, junto con el formato del mensaje y los detalles del protocolo para el servicio web.

Si desea obtener más información sobre WSDL, consulte nuestro tutorial de WSDL .

JABÓN

SOAP es un protocolo simple basado en XML que permite a las aplicaciones intercambiar información a través de HTTP.

Si desea obtener más información sobre SOAP, consulte nuestro tutorial SOAP .