Inicio Desarrollo Web Implementar XML-RPC en PHP

Implementar XML-RPC en PHP

Algo que interesante de WordPress es que podemos escribir nuevos contenidos a través de software de escritorio como, por citar un ejemplo, Windows Live Writer. Aunque en realidad WordPress no es único CMS que provee está característica, a través de éste me di cuenta que usa un archivo llamado xmlrpc.php. Me puse averiguar estos términos: XML-RPC. En Wikipedia encontramos una definición más que satisfactoria:

… es un protocolo de llamada a procedimiento remoto que usa XML para codificar los datos y HTTP como protocolo de transmisión de mensajes.

Es un protocolo muy simple ya que sólo define unos cuantos tipos de datos y comandos útiles, además de una descripción completa de corta extensión. La simplicidad del XML-RPC está en contraste con la mayoría de protocolos RPC que tiene una documentación extensa y requiere considerable soporte de software para su uso.

[…]

Existen implementaciones para varios sistemas operativos, lenguajes de programación, licencias comerciales y de software libre.

Llamar a procedimientos remotos usando XML enviandolo por HTTP. Así podía entender mejor como las aplicaciones de escritorio para escribir contenidos en los blogs funcionaban. Eso quiere decir que puedo enviar datos de un aplicación hecha con cierto lenguaje de programación a otra aplicación desarrollada con un lenguaje distinto usando este protocolo.

Como menciona la definición XMLRPC: existen implementaciones para varios lenguajes de programación. Lo cual nos indica que algunos lenguajes no traen de forma nativa funciones que manejen este protocolo, por lo que se ayudan de algunas librerías extras (ver cómo podemos implementar con distintos lenguajes de programación).

En el caso de PHP existen muchas librerías para implementar XML-RPC, y así usarlo en nuestras aplicaciones. Una de estas, y que me parecio simple de usar, es phpxmlrpc

Para mostrar el funcionamiento, veamos el siguiente ejemplo, que por cierto lo encontre en un blog en español, aunque hize algunas pequeñas modificaciones para que funcionará correctamente.

En la parte del cliente se mostrará un formulario donde permita escribir el código ISBN de un libro. Se usará la librería phpxmlrpc para pedir información remota de un procedimiento que se encuentra en el servidor web.

dv_cliente.php

<form name="form1" method="post" action="dv_cliente.php">
<input type="text" name="txtIsbn">
<input type="submit" name="Submit" value="Buscar">
</form>
<?php
include("lib/xmlrpc.inc");
if (isset($HTTP_POST_VARS["txtIsbn"])){
$f=new xmlrpcmsg('libros.buscaIsbn',array(new xmlrpcval($HTTP_POST_VARS["txtIsbn"], "int")));

print "<pre>".htmlentities($f->serialize())."</pre>\n";
//$c=new xmlrpc_client("dv_servidor.php", "pecesama.ipowermysql.com", 80);

$c=new xmlrpc_client("http://localhost/xml-rpc/dv_servidor.php");

$c->setDebug(0);
$r=$c->send($f);
if(!$r){
die("Falló SEND");
}

$v=$r->value();

if(!$r->faultCode()){
print "Título del libro ".$HTTP_POST_VARS["txtIsbn"]." es ".$v->scalarval()."<BR>";
}else{
print "Falla: ";
print "Número de error: " .$r->faultCode()." Descripción del error '".$r->faultString()."'<BR>";
}
}
?>

Ahora la parte del procedimiento en el servidor, es una función en PHP que recibirá datos de tipo entero. En este caso el ISBN de cierto libro. 

dv_servidor.php

<?php
//Ejemplo de un servidor XML-RPC en PHP
//Recibe un ISBN y regresa el Título //del libro.
include("lib/xmlrpc.inc");
include("lib/xmlrpcs.inc");

function BuscaIsbn($NoIsbn) {
global $NoError;
$err="";

// Obtenemos el parametro
$ParIsbn=$NoIsbn->getParam(0);

// Vemos si es del tipo correcto
if(isset($ParIsbn) && ($ParIsbn->scalartyp()=="int")){
// Obtenemos el valor numerico
$isbn=$ParIsbn->scalarval();
// Buscamos el libro
switch($isbn){
case 1: $titulo="PHP";
break;
case 2: $titulo="XML_RPC";
break;
case 3: $titulo="Sitios web";
break;
case 4: $titulo="Linux";
break;
default:$NoError=1;
$err="No hay libro ". "con el ISBN '". $isbn . "'";
}
}else {
// No es entero
$err="Se requiere un número";}

// Creamos la respuesta
if ($err){
// Si hay error
return new xmlrpcresp(0, $NoError, $err);
}else{
// Si no hay error
return new xmlrpcresp(new xmlrpcval($titulo));
}
}

//Creamos el servidor
$s=new xmlrpc_server(array("libros.buscaIsbn" =>array("function" => "BuscaIsbn")));
?>

Para probar simplemente accede al archivo dv_cliente.php por web y escribe un numero cualquier y el procedimiento remoto mostrará la información pertinente.Y he allí el funcionamiento de XML-PHP implementado en PHP.

Aca hemos visto de manera muy rápida, al vuelo, sobre este protocolo: una definición y un ejemplo a lo práctico. En proximos artículos ahondaremos más sobre el tema. Si conoces algo de XML-RPC pues ¿por qué no compartirlo?

Sitio oficial de XML-RPC

Programador y Desarrollador Web. Administrador de RibosoMatic y Proyecto Yupy. Blogger y entusiasta de la tecnología, internet, software y tutoriales para desarrollo de aplicaciones para la web ....

8 COMENTARIOS

  1. Que buen post, estoy justamente buscando informacion sobre XML-RPC para programar un sistema de notificacion de actualizaciones para un CMS que he iniciado a desarrollar 🙂

    Te invito a que lo visites: http://www.mantavirtual.com/ en las noticias, puedes dejar un comentario 🙂

    Me gustaria implementar los “trackback” de wordpress para los comentarios y la posibilidad de automatizar la notificacion de actualizados 😛 como wordpress igualmente 🙂

    Si posees algo de informacion adicional que consideres me pueda ayudar, te lo agradeceria.

    Saludos,

  2. Hola, buen artículo, necesito un poco de tu experiencia. He bajado las versiones de xml-rpc 2.2.2 y estoy haciendo pruebas sobre un servidor WAMP local. el tema es que no obtengo respuesta al parecer del server. solo se pinta el cliente. Que peude estar pasano o que puedo haber omitido?

  3. Hola

    Excelente ejemplo, he implementado un sistema CMS que ya incorpora pingbaks y trackbacks. Este funciona como un indexador de noticias y blogs.

    http://www.sysmaya.net

    Ahora estoy montando un sistema de notificacion de pings para agregar comentarios y recibir notificaciones de actualizaciones. Por lo pronto solo uso el XML-RPC para “sacar datos” ahora quiero usarlo para “recibir”.

    te recomiendo la libreria pingor.php

  4. Hola

    otra vez yo, acabo de revisar mis archivos en busca de algun script phpsobre el cual implementar el server XML-RPC y he hallado una que por facilidad de uso y su versatilidad la recomiendo sobre otras es trackback_cls.php

    esta clase permite sic “PHP Class to handle TrackBacks (send/ping, receive, retreive, detect, seed, etc…)”

    solo basta con un include la clase.
    Ejemplo para enviar un trackback:

    include_once(‘trackback_cls.php’);
    $trackback = new Trackback(“Trackback”, ‘usuario’, ‘UTF-8’);
    $rtaPing = $trackback->ping( $destino, $origen, $titulo, $texto);

    ahora si bye

  5. Bien, no sabia que estos tipo de archivos da para este tipo de aplicacion. Chevere pero ahor a lo que me trajo aqui es porque ando buscando que exactamente hace este archivo en wp para implementarlos en mi propio Merlyna CMS

  6. Estoy desarrollando un programa para moviles, y necesito interactuar con un servidor XML-RPC, gracias a ustedes he logrado avanzar un poco pero ahora necesito saber si tienen algun truco para saber el nombre de la funcion o method que se va a ejecutar en el servidor.
    siempre me dice:
    server error. requested method StarTag does not exist.

    aunque es obvio no, se que funcion recibe los parametros, existe algun truco para saberla?

  7. Otra pregunta: si del lado del servidor quisiera guardar un log de las conexiones y el XML pasado, se podra? aun si el cliente paso el method o params incorrectos?

Deja un comentario