Definr y Groovy: ¡Fácil!

Hoy vamos a ver un mini-ejemplo de código en Groovy que puede resultar muy útil.

class Definr{
static String define(String word){
def html = "http://definr.com/$word".toURL().text
def definr = new XmlSlurper().parseText(html)
definr.body.div.div.toString()
}
}

def definicion = Definr.define("signature")
println definicion


El código muestra una clase llamada Definr que tiene un único método static llamado define que recibe como parámetro la palabra de la que se quiere su definición y la devuelve como un simple String.

Para que Definr nos muestre una página con el significado que buscamos, podemos construir un URL con el siguiente formato: "http://definr.com/palabra" donde "palabra" es sustituida por el término que queremos definir.

Utilizando la magia de las cadenas sexy de Groovy (GStrings), escribimos "http://definr.com/$word" y automáticamente, Groovy sustituirá la cadena"$word" por el valor del parámetro pasado a define.

Empleamos el método toURL de la cadena que construimos para obtener un objeto java.net.URL y con el método text, Groovy se encarga de hacer un request y guardar en la variable html el texto de respuesta. Así de fácil, así de sencillo.

Ahora, en medio de todo ese texto que recibimos se encuentra la definición.

<html>
<head>
...
</head>
<body>
...
<div>
<div> La definición </div>
</div>
</body>
</html>

Ya que la estructura de xml y html son muy semejantes (y asumiendo que Definr sigue buenas prácticas en la generación de html), utilizamos un XmlSlurper. XmlSlurper es una clase que recibe un documento xml y nos permite navegar de manera "Groovy" su estructura.


definr.body.div.div.toString() //De definr pasamos al body, luego al primer div, donde encontramos el div con el significado



Dicho y hecho, viendo la estructura de la página resultado, podemos "descender" a través de los nodos hasta llegar al elemento "div" que contiene el significado. Utilizamos toString para obtener el texto dentro del elemento y lo regresamos. Nótese que Groovy no requiere el uso de return. Como el método define es estático, no necesitamos una instancia de la clase Definr para invocarlo.

Y obtenemos la definición (programming):

programming (http://definr.com/programming)
n 1: setting an order and time for planned events [syn: scheduling,
programing]
2: creating a sequence of instructions to enable the computer
to do something [syn: programing, computer programming,
computer programing]



Y así, en tan solo 7 líneas, con un código claro y conciso, aunque dejando un poco de lado la validación del parámetro, obtuvimos el contenido de una página web y extrajimos los que nos importaba.

Existen muchos "servicios" web para los que podemos utilizar la misma técnica de construir URLS y "parsear" el contenido para sacar algo de manera muy conveniente y utilizarlo en nuestras aplicaciones.

Ejemplo: Domino's Pizza ofrece un servicio web de rastreo de nuestro pedido (por el momento solo en EU). Desde ésta URL "http://trkweb.dominos.com/orderstorage/GetTrackerData" y agregando como parámetro nuestro número telefónico, e.g. "http://trkweb.dominos.com/orderstorage/GetTrackerData?Phone=1234567890" obtenemos un documento con el que podemos saber si nuestra pizza ya está en camino o aún está en el horno.

Aquí pueden ver un ejemplo de ésto en Python.

Groovy es un lenguaje muy divertido y fácil de usar. Se los recomiendo. Tal vez la próxima vez, muestre cómo construir una simple interfaz gráfica para nuestro "diccionario", en muy pocas líneas. Compartan sus dudas e ideas en los comentarios.