inicio mail me! sindicaci;ón

Triscando con XML-RPC

Hace ya mucho que había oído sobre XML-RPC, pero quitando lo de XML y lo de RPC no sabía exactamente de qué iba. Así que casualidades de la vida, encontré el XML-RPC Howto, y le he pegado una leída esta mañana en lo que esperaba a un personaje.

El XML como sabréis es un lenguaje de marcas, subconjunto de SGML (algo menos potente y sobre todo más sencillito de usar), utilizado para almacenar o transferir datos.

Y RPC es Remote Procedure Call: Hacer uso de funciones que corren en otras maquinas. Por ejemplo, si yo hago una función que deba de calcular la media de las notas de los alumnos tomadas de una base de datos dada, podría programar por un lado la función que saca los datos de la base de datos y por otro lado la función que calcula que llama a la función que saca los datos y que luego calcula la media. Esta última función podría ejecutarse en una máquina y llamar a la que extrae los datos que se encuentra en otra máquina:

funcion media(lista de alumnos)

{

lista_notas=saca_notas(lista de alumnos);

i=suma=0;

por cada nota de lista_notas {

suma+= nota;

i++;

}

devuelve suma/i; //La división que saque decimales!!
}

funcion saca_notas(lista de alumnos)

{

handler_db=conecta_con_base_datos(parámetros);

devuelve peticion_base_datos(handler_db,”todas las tuplas de la tabla patatin donde tupla.nombre_alumno este en la lista;”); //Una especie de join entre la lista de alumnos y la tabla patatin

}

Con la particularidad de que cada función se ejecuta en una máquina diferente, en este caso secuencialmente.

XML-RPC lo que hace es transferir las llamadas a los procedimientos y los resultados de éstos vía XML y HTTP. Hace peticiones en XML como ésta:

<methodCall>
<methodName>nombreProcedimiento</methodName>
<params>
<param><value><int>5</int></value></param>
<param><value><double>2.717218</double></value></param>
<param><value><string>cadena</string></value></param>
</params>
</methodCall>

Y la envía usando HTTP al servidor donde se encuentra la función, que usando igualmente HTTP y XML le da la respuesta.

No cuenta con la misma potencia que SOAP, que también funciona mediante XML, ni con la potencia ni complejidad de CORBA (usado en Gnome, ¿os suena Orbit? ¿Bonobo?), ni es el DCOM del .Net de Microsoft sólo para sistemas Microsoft.

Para evitar el lag en la comunicación con el servidor se le puede enviar una lista de procedimientos a ejecutar, en vez de enviar uno a uno esperando a cada respuesta.

Todo esto junto con ejemplos en mogollón de lenguajes de programación (C, C++, perl, python, ruby, java y algún otro) lo podéis encontrar en el breve howto de 26 páginas. Sorprende la facilidad con la que se programa en python o en ruby (¿ese do |a,b| en el código del servidor es una función anónima?) frente a la complejidad del código en C o en C++ donde hay que andar iniciando las librerías y demás. Se le rápido

Veamos un ejemplo en Python:

import xmlrpclib
# Create an object to represent our server.
server_url = ‘http://xmlrpc-c.sourceforge.net/api/sample.php’;
server = xmlrpclib.Server(server_url);
# Hacer la llamada al procedimiento.
result = server.nombreProcedimiento(5, 2.717218, “cadena”)
print “Resultado:”, result
hermoso y simple, ¿verdad?

He hechado en falta ejemplos en Lisp, porque desde luego Lisp tiene un interfaz para XML-RPC.

Leave a Comment