Windows Phone–Tutorial XIV – Usando datos en Windows Phone 7–Servicios REST

En el anterior post vimos como utilizar un servicio SOAP, en este vamos a consumir un servicio REST, para ello vamos a aprovecharnos de todo el código anterior y utilizaremos el servicio de Google de traducción que es de tipo REST.

En nuestro caso recoger los lenguajes que nos permite traducir no es posible ya que Google no lo proporciona para ello

1 private void GetLanguagesGoogle() 2 { 3 Language la = new Language(); 4 la.Code = "en"; 5 la.Name = "English"; 6 _languages.Add(la); 7 8 la = new Language(); 9 la.Code = "es"; 10 la.Name = "Spanish"; 11 _languages.Add(la); 12 13 la = new Language(); 14 la.Code = "ar"; 15 la.Name = "Arabic"; 16 _languages.Add(la); 17 } 18

Para utilizar la traducción de Google llamaremos a la url https://www.googleapis.com/language/translate/v2?key=YOUR-API-KEY&source=en&target=es&q=Hello

Para conseguir tu key debes de registrarte en https://code.google.com/apis/console/?pli=1#welcome

Definimos una variable con la url

1 private readonly string SERVICE_URL = @"https://www.googleapis.com/language/translate/v2?key=YOUR-API-KEY&source={0}&target={1}&q={2}";

Para llamar a un servicio REST debemos de utilizar el objeto WebClient por lo que en nuestro método Traslate

1 private void Translate() 2 { 3 WebClient _proxy = new WebClient(); 4 _proxy.DownloadStringCompleted += new DownloadStringCompletedEventHandler(_proxy_DownloadStringCompleted); 5 string googleTranslateUrl = string.Format(SERVICE_URL, 6 LanguageFromSelected.Code, LanguageToSelected.Code, LanguageFrom); 7 _proxy.DownloadStringAsync(new Uri(googleTranslateUrl)); 8 } 9

Observáis como componemos la URL con los datos y llamamos al método DownloadStringAsync , para recoger el resultado debemos parsearlo ya que al no ser un servicio SOAP nos va a devolver un XML o JSON, para ello utilizaremos DataContractJsonSerializer, en el ejemplo que voy a poner voy a utilizar la v1 de la API de Google en la que no hace falta la API key que os he explicado antes, la url es

https://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q={0}&langpair={1}|{2}
Un ejemplo seria
https://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=Hello,%20my%20friend!&langpair=en%7Ces
La respuesta que obtendríamos en el navegador es
{
  "responseData": {
    "translatedText": "Hola, mi amigo!"
  },
  "responseDetails": null,
  "responseStatus": 200
}

Con DataContractJsonSerializer deberíamos crear una clase en el model que refleje los datos JSON que vamos a serializar, yo voy a crear dos clases TranslationResponse y ResponseData estas clases deben de estar decoradas con los atributos DataContract y DataMember

1 [DataContract(Name = "translateResponse")] 2 public class TranslationResponse 3 { 4 5 [DataMember(Name = "responseData")] 6 public ResponseData ResponseData { get; set; } 7 8 9 [DataMember(Name = "responseDetails")] 10 public string ResponseDetails { get; set; } 11 12 13 [DataMember(Name = "responseStatus")] 14 public int ResponseStatus { get; set; } 15 }

 
1 [DataContract(Name = "translations")] 2 public class ResponseData 3 { 4 5 [DataMember(Name = "translatedText")] 6 public string TranslatedText { get; set; } 7 8 9 [DataMember(Name = "detectedSourceLanguage")] 10 public string DetectedSourceLanguage { get; set; } 11 }

Ahora para deserializar la respuesta es tan sencillo como el código que tenéis abajo

 

1 void _proxy_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 2 { 3 4 DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(TranslationResponse)); 5 MemoryStream ms = new MemoryStream(Encoding. UTF8.GetBytes(e.Result)); 6 7 TranslationResponse t = (TranslationResponse)serializer.ReadObject(ms); 8 9 LanguageTo = t.ResponseData.TranslatedText; 10 11 }

El resultado sería

image

 

Os dejo el código, no os asustéis del nombre del proyecto ya que he reutilizado el anterior, pero en vez de bing es el de Google

 

5 comentarios en “Windows Phone–Tutorial XIV – Usando datos en Windows Phone 7–Servicios REST”

  1. Hola Oskar,

    Cuál es el método más rápido para comunicación cliente-servidor entre WP7 y los servicios? WebServices clásicos? WCF con alguna configuración específica?

    Me doy cuenta en alguna app que las llamadas a webservices son muy muy lentas…

    Un saludo

  2. Impresionante Oskar, veo que el mensaje REST es muchísimo más pequeño, y con la librería de serialización que propones, no hay que temer 🙂

    Gracias por estos geniales artículos!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *