miércoles, 20 de julio de 2011

LLamada a un metodo XML-RPC

XML-RPC es un protocolo desarrollado por Microsoft en conjunto con un ingeniero (no recuerdo el nombre) de la empresa UserLand Software a fines de los 90, ocupa XML como medio de codificación de datos y el protocolo http para la transmisión de mensajes, si bien es un protocolo simple y muy básico en cuanto a funcionalidades es la base de lo conocemos actualmente como SOAP. La invocación de estos servicios no es una tarea compleja pero debido a la escasa literatura que existe respecto a este tema he decidido dar un ejemplo de su implementación esperando que a más de a uno lo ayude.

Para llevar a cabo la invocación se necesita lo siguiente:

1) la Dirección Web en donde está alojado el servicio a llamar (url).

2) El XML con los parámetros de entrada y las especificaciones del método(xmlparam).

El XML tiene la siguiente estructura

<?xml version="1.0"?>
<methodCall>
<methodName>Nombre metodo</methodName>
<params>
<param>
<value><i4>valor</i4></value>
</param>
</params>
</methodCall>

Sabiendo esto la llamada la hacemos de la siguiente forma:

public string LLamadaXMLRPC(string url, string xmlparam)

{

WebRequest webRequest = WebRequest.Create(url);

webRequest.ContentType = "application/x-www-form-urlencoded";

webRequest.Method = "POST";

byte[] bytes = Encoding.ASCII.GetBytes(xmlparam);

Stream os = null;

try

{ // send the Post

webRequest.ContentLength = bytes.Length; //Count bytes to send

os = webRequest.GetRequestStream();

os.Write(bytes, 0, bytes.Length); //Send it

}

catch (WebException ex)

{

//

}

finally

{

if (os != null)

{

os.Close();

}

}

try

{ // get the response

WebResponse webResponse = webRequest.GetResponse();

if (webResponse == null)

{ return null; }

StreamReader sr = new StreamReader(webResponse.GetResponseStream());

return sr.ReadToEnd().Trim();

}

catch (WebException ex)

{

//

}

return null;

}

Al ver el código se darán cuenta que la llamada es a través de un POST y tiene como propiedad "application/x-www-form-urlencoded", esto tiene como función codificar todos los caracteres antes de que sean enviados.