World of Warcraft, el exitoso mundo persistente de Blizzard, con sus más de 11 millones de jugadores, se ha convertido en el modelo a seguir para cualquier MMO.
Su política cercana al Software Libre, en el desarrollo de extensiones para la UI del juego, ha incentivado la creación de cientos de AddOn de todo tipo de mejoras y ayudas. Cubriendo los más insospechados nichos.
Para ello Blizzard, basado en el lenguaje de programación LUA, ofrece a los desarrolladores una impresionante API para el desarrollo en el propio juego. Y una sencilla API Rest, que devuelve mensajes en formato Json. Que es la que voy a utilizar para realizar el ejemplo de lo que trata este post.
Tecnología y herramientas
Voy a utilizar como lenguaje de programación C#. Y para el tratamiento de los mensajes JSON, una librería open source llamada Json.Net, que es una maravilla. Pero para hacer la cosa más compleja, en vez de hacer el clásico ejemplo para consola o para webform, voy a construir el código para Windows phone 7. Lo cual implica que todas las llamadas al API Rest, deberán ser asíncronas.
Como buen programador .NET, mi IDE es Visual Studio. En este caso la versión 2010 con el SDK de desarrollo de Windows Phone 7.5. Que tiene, a mi parecer, uno de los mejores emuladores de dispositivo móvil posibles.
API Battlet.net
Aunque parezca una perogrullada, lo primero que hago cuando me enfrento a un nuevo API, es leerme su documentación y realizar los ejemplos. Así con escribir en mi navegador,
http://eu.battle.net/api/wow/realm/status
Obtengo una respuesta codificada en Json con mucha información sobre el estado de los reinos del juego de Europa. Y, leyendo el resto de la descripción del API, me hago consciente de que tengo acceso de una forma fácil y sencilla a un gran volumen de datos de mi juego favorito.
Otra cosa que hay que tener en cuenta cuando desarrollo con una API de terceros, son las condiciones de uso. Cuando, como y si hay que pagar. Y que puedes y no puedes hacer si quieres utilizar la herramienta.
En este caso Blizzard utiliza un modelo similar al de Software Libre. Es decir, el código debe estar visible; no puedes ganar dinero de ninguna forma (ni directa, ni indirectamente), si la aplicación utiliza los servicios del API; no puedes utilizar los nombres, gráficos y colores de Blizzard; y, curioso, te recuerda que desarrollar con esta API no significa que tengas un acuerdo o contrato con ellos.
Llamadas asíncronas
Como comenté al inicio del artículo, el ejemplo lo he realizado para funcionar en un Windows Phone 7, lo cual me obliga a tener que hacer una llamada asíncrona al servicio, para recuperar el contenido en Json.
Esto implica que primero voy a realizar la petición a la url y, en vez de quedarme esperando la devolución de datos, espero que se lance el evento que me avisa que se ha completado la operación.
private void GetPersonaje()
{
string uri = http://eu.battle.net/api/wow/character/los-errantes/bendemfalar;
var webclient = new WebClient();
webclient.DownloadStringCompleted += OnDownloadStringCompleted;
webclient.DownloadStringAsync(new Uri(uri));
}
private void OnDownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
// GestorDeJson lectorJSon = new GestorDeJson();
// lectorJSon.RecuperaDatosPersonaje(e.Result);
}
Aunque del primer vistazo parece complejo, realmente no lo es. Voy a desglosarlo para que sea más fácil de entender.
Lo primero que declaro es la url que voy a invocar para obtener la información.
string uri = http://eu.battle.net/api/wow/character/los-errantes/bendemfalar;
WebClient() es una clase que encapsula un cliente web completo. Sería más correcto utilizar httpWebRequest, pero es más complejo para este ejercicio.
var webclient = new WebClient();
A continuación le digo a webclient el método que debe de lanzar cuando se haya completado la operación. Recuerda que es asíncrona, así no tendré que detener la aplicación a la espera del resultado.
webclient.DownloadStringCompleted += OnDownloadStringCompleted;
Y entonces lanzo el método de carga asíncrona del WebClient, pasándole la url por parámetro. Completando la operación en cuanto construya el método que he suscrito al evento.
webclient.DownloadStringAsync(new Uri(uri));
Cualquiera que haya trabajado con asp.net, encontrará muy conocida esta firma de método. Y familiar la forma de trabajar con el. En este caso, he construido una clase que va a gestionar el documento Json, y en donde voy a invocar el método que va a tratar y cargar los datos en los objetos.
private void OnDownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
GestorDeJson lectorJSon = new GestorDeJson();
lectorJSon.RecuperaDatosPersonaje(e.Result);
}
Más información | Blizzard Community Platform API Documentation, WebClient
En GenbetaDevv | Cómo hacer un escaner para Twitter