Buenas a todos,

dejando un poco de lado MonoTouch hoy vamos a ver cómo acceder a la API de Google Weather desde .NET. En mi caso particular tuve que hacerlo para una App que estoy desarrollando para WP7. Pero dado que a penas hay cambios he decidido hacer la entrada de un modo más general.

Lo primero que necesitaremos es definir la clase más simple que contendrá la información a mostrar al usuario:

   1:  

   2:     public class Tiempo

   3:     {

   4:        public ExtendedImage Icon {get;set;} //Puede ser una imagen o un String depende del tipo de App. 

   5:        public string Dia { get; set; }

   6:        public string Min { get; set; }

   7:        public string Max { get; set; }

   8:        public string Condicion { get; set; }

   9:  

  10:     }

A continuación, crearemos la clase que contiene el acceso a la API:

   1: public delegate void DownloadComplete ();

   2:  

   3:    public class GoogleWeather

   4:    {

   5:    public event DownloadComplete EDownloadComplete;

   6:           

   7:    public List<Tiempo> Temperaturas { get; set; }

   8:  

   9:  

  10:        public GoogleWeather(string localizacion, string cod)

  11:        {

  12:            WebClient webclient = new WebClient();

  13:            webclient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(WebClient_DownloadCompleted);

  14:            webclient.DownloadStringAsync(new Uri("http://www.google.com/ig/api?weather=" + localizacion + "&hl="+cod+"&oe=utf-8")); // weather location

  15:  

  16:        

  17:  

  18:        }

  19:      

  20:  

  21:  

  22:        protected void WebClient_DownloadCompleted(object sender, DownloadStringCompletedEventArgs e)

  23:        {

  24:            if (e.Error != null)

  25:                throw new Exception("Ha ocurrido un error");//TODO Cambiar al idioma correspondiente.

  26:  

  27:            Temperaturas = new List<Tiempo>();

  28:  

  29:            XElement XMLTemperatura = XElement.Parse(e.Result);

  30:            foreach (var elemento in XMLTemperatura.Descendants("forecast_conditions"))

  31:            {

  32:                Tiempo t = new Tiempo();

  33:                t.Dia = (string)elemento.Element("day_of_week").Attribute("data").Value;

  34:                t.Max = (string)elemento.Element("high").Attribute("data").Value;

  35:                t.Min = (string)elemento.Element("low").Attribute("data").Value;

  36:                t.Condicion = (string)elemento.Element("condition").Attribute("data").Value;

  37:  

  38:                ImageTools.IO.Decoders.AddDecoder<GifDecoder>();

  39:                ImageTools.ExtendedImage image = new ImageTools.ExtendedImage();

  40:                string  gifUrl = "http://www.google.com/" + (string)elemento.Element("icon").Attribute("data").Value;

  41:                image.UriSource = new Uri(gifUrl, UriKind.Absolute);

  42:                t.Icon = image;

  43:  

  44:                Temperaturas.Add(t);

  45:            }

  46:  

  47:            EDownloadComplete();

  48:  

  49:        }

  50:  

  51:  

  52:  

  53:  

  54:  

  55:  

  56:    }

 

Como se puede ver en el código, la clase se compone de:

  • Una lista de Tiempo que es la clase que hemos creado anteriormente.
  • Un evento que permite comunicarnos con el exterior para saber que se han descargado los datos o que ha ocurrido algún tipo de error. Recordemos que la carga se realiza de forma asíncrona.
  • El método que se subscribe al Webclient (hablaremos algo más de él a continuación).
  • El constructor de la clase. En el constructor se establece la localización y el idioma utilizado. Por defecto el idioma es inglés, que viene representado por “en”. Cabe destacar que Google nos devuelve la información con el sistema métrico utilizado para cada idioma. Como sabemos los países anglosajones utilizan Fahrenheit y el resto, Celsius. Por otra parte, la localización puede ser un código postal, una ciudad, un municipio, etc.

Como hemos visto, en WebClient_DownloadCompleted es dónde esta el meollo de la cuestión. En primer lugar comprobamos si ha ocurrido un error. A continuación solamente tenemos que acceder a los datos (son devueltos en XML) e ir rellenando la lista. Como veréis en este caso cambio el formato de la imagen. Y es que Google devuelve la imagen en formato GIF y como sabemos, Silverlight no soporta este formato de forma nativa. Por ello he utilizado herramientas de terceros para convertir la imagen. Podéis acceder al proyecto aquí.

Finalmente, se genera el evento y la clase que va a estar subscrita al mismo mostrará los datos al usuario.

Hasta la próxima!