- Acceso a servicios web de terceros

 


 

En este apartado nos centraremos en cómo utilizar un servicio REST publicado por un tercero. Como se ha comentado el acceso a un servicio SOAP resulta algo más complicado y Android no dispone de librerías para facilitarnos el trabajo.

Ejercicio: Acceso a servicios Web de búsqueda de libros.

En concreto vamos a utilizar el servicio Books API, que permite buscar y gestionar libros de la base de datos de Google. Es un servicio obsoleto, aunque actualmente operativo. No usaremos el nuevo servicio que ofrece Google (nueva Books API), dado que este nos da el resultado en JSON en lugar de en XML y en este libro no hemos estudiado el trabajo con JSON.

 

1.     Para probar el servicio Web abre un navegador web y accede a la siguiente URL:

  http://books.google.com/books/feeds/volumes?q=antonio+banderas

El resultado ha de ser similar a:

<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/"
      xmlns:gbs=http://schemas.google.com/books/2008
      xmlns:dc=http://purl.org/dc/terms
      xmlns:batch=http://schemas.google.com/gdata/batch
      xmlns:gd=http://schemas.google.com/g/2005
      xmlns="http://www.w3.org/2005/Atom" >
   <id >http://www.google.com/books/feeds/volumes</id>
   <updated >2012-01-30T23:56:34.000Z</updated>
   <category scheme=http://schemas.google.com/g/2005#kind
      term="http://schemas.google.com/books/2008#volume" />
    <title type="text" > Search results for antonio banderas</title>
   <link href="http://www.google.com" rel="alternate" type="text/html"/>
   <link href=http://www.google.com/books/feeds/volumes
      rel="http://schemas.google.com/g/2005#feed"
      type="application/atom+xml" />
   <link
      href=http://www.google.com/books/feeds/volumes?q=antonio+banderas
      rel="self" type="application/atom+xml" />
   <link href="http://www.google.com/books/feeds/volumes?q=antonio
      +banderas&amp; start-index=11&amp;max-results=10" rel="next"
      type="application/atom+xml" />
   <author><name>Google Books Search</name>
      <uri>http://www.google.com</uri></author>
   <generator version="beta" >Google Book Search data API</generator>
   <openSearch:totalResults >596</openSearch:totalResults>
   <openSearch:startIndex >1</openSearch:startIndex>
   <openSearch:itemsPerPage >10</openSearch:itemsPerPage>
   <entry >
      <id >http://www.google.com/books/feeds/volumes/_Y81OAAACAAJ</id>
      <updated >2012-01-30T23:56:34.000Z</updated>
   …

En el resultado obtenido localiza la etiqueta totalResults. Representan los libros encontrados que contienen la búsqueda “antonio banderas”.

2.     Abre el proyecto HTTP creado en el ejercicio Utilizando HTTP desde Android”. Ahora utilizaremos un servicio web de búsqueda de libros, en lugar de buscar la información en una página web.

 

3.     En la actividad principal añade el siguiente método:

String resultadosSW(String palabras) throws Exception {
   URL url = new URL("http://books.google.com/books/feeds/volumes?q=\""
          + URLEncoder.encode(palabras, "UTF-8") + "\"");
   SAXParserFactory fabrica = SAXParserFactory.newInstance();
   SAXParser parser = fabrica.newSAXParser();
   XMLReader lector = parser.getXMLReader();
   ManejadorXML manejadorXML = new ManejadorXML();
   lector.setContentHandler(manejadorXML);
   lector.parse(new InputSource(url.openStream()));
   return manejadorXML.getTotalResults();
}

El método comienza creando la URL de acceso. El resto del código utiliza las librerías org.xml.sax.* para realizar un proceso de parser sobre el código XML de la URL y así extraer la información que nos interesa. Este proceso se ha explicado en el capítulo anterior. El trabajo que sí que tendremos que realizar en función del formato XML específico será la creación de la clase XMLHandler. Una vez finalizado el parser, podemos llamar al método getTotalResults() de nuestro manejador para que nos devuelva la información que nos interesa.

4.     Realiza una copia del método buscar() cambiando el nombre por buscar3(). En este método reemplaza resultadosGoogle() por resultadosSW().

5.     Abre el layout activity_main.xml y añade un botón con texto: “buscar en SW libros” y con un valor para onClick: “buscar3”.

 

6.     A continuación mostramos la definición de la clase ManejadorXML. Copia este código dentro de la clase MainActivity:

 

public class ManejadorXML extends DefaultHandler {

   private String totalResults;
   private StringBuilder cadena = new StringBuilder();
   
   public String getTotalResults() {
      return totalResults;
   }

   @Override
   public void startElement(String uri, String nombreLocal, String
         nombreCualif, Attributes atributos) throws SAXException {
      cadena.setLength(0);
   }

   @Override
   public void characters(char ch[], int comienzo, int lon){
      cadena.append(ch, comienzo, lon);
   }

   @Override
   public void endElement(String uri, String nombreLocal,
      String nombreCualif) throws SAXException {
      if (nombreLocal.equals("totalResults")) {
         totalResults = cadena.toString();
      }
   }
}

Para procesar el fichero XML extendemos la clase DefaultHandler y rescribimos muchos de sus métodos: en startElement() inicializamos la variable cadena cada vez que empieza una etiqueta; en el método characters() añadimos el contenido que aparece dentro de la etiqueta; finalmente, en endElement() recogemos el valor acumulado en cadena cada vez que termina una etiqueta. Como hemos comentado, de todo el código XML que vamos a procesar, solo nos interesa el contenido de la etiqueta <totalResults>.

7.     Verifica el funcionamiento de la aplicación.

 

Práctica:  Convertidor de divisas mediante un servicio web

Uno de los servicios Web, ofrecidos en Yahoo Finance API, permite obtener la ratio de conversión de divisas según el cambio actual. A continuación se muestra un ejemplo de uso para obtener la ratio euro-dólar:

http://finance.yahoo.com/d/quotes.csv?s=EURUSD=X&f=l1

1.     Retoma el diseño de layouts de la eurocalculadora, realizado en el capítulo 2, para un nuevo proyecto de conversión de divisas. En una primera fase solo se realizará la conversión de euros a dólares, aplicando la ratio obtenida a través del servicio web indicado.

2.     En una segunda fase puedes permitir que el usuario seleccione la divisa de entrada (reemplazando en la URL “EUR”) y la de salida (reemplazando en la URL “USD”). Puedes encontrar una lista de las divisas disponibles en [1].