API de Google: Cómo leer en consola un XML del API de Google (u otro XML)

Introducción

Actualmente estoy desarrollando un aplicativo que debe manipular los contactos de una cuanta de Google Apps. Para ello uso el API de Google Contacts [1], Por defecto los mensajes que envía y recibe Google a través de su servicio (REST) son en XML. Como programador no supone un problema manipular un XML, pero si queremos depurar o hacer pruebas en consola leer un XML sin espacios, saltos de línea o tabulados puede ser especialmente engorroso.

Una solución es usar una herramienta cómo indent, pero para XML.Esta herramienta es tidy.

Instalar tidy en Debian/Ubuntu y cómo usarlo

Para instalar Tidy sólo hay que teclear:

sudo apt-get install tidy

Un ejemplo de uso sería, dado un fichero entrada.xml sin formatear, sin saltos de línea ni espacios si queremos guardarlo en un fichero salida.xml preparado para leerlo seres humanos podríamos hacerlo con la secuencia de comandos:

cat entrada.xml | tidy -utf8 -xml -w 255 -i -c -q -asxml > salida.xml

Para más opciones de tidy, leer su página de manual en la referencia [3].

Ejemplo de uso con el API de Google

Visto el apartado anterior y los ejemplos de uso visto en el enlace [1] podemos obtener la información de un contacto de nuestra libreta de contactos de Google en XML con el comando:

$ curl -H "Authorization: Bearer -------Your_OAuth_Access_Token_Here-----------------" https://www.google.com/m8/feeds/contacts/default/full?max-results=1 |tidy -utf8 -xml -w 255 -i -c -q -asxml
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2799    0  2799    0     0   6327      0 --:--:-- --:--:-- --:--:-- 87545
<?xml version='1.0' encoding='utf-8'?>
<feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:gContact='http://schemas.google.com/contact/2008' xmlns:batch='http://schemas.google.com/gdata/batch' xmlns:gd='http://schemas.google.com/g/2005'>
  <id>jose.perez.martinez@gmail.com</id>
  <updated>2013-09-27T10:14:56.316Z</updated>
  <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact' />
  <title type='text'>José Pérez Martínez's Contacts</title>
  <link rel='alternate' type='text/html' href='http://www.google.com/' />
  <link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/jose.perez.martinez%40gmail.com/full' />
  <link rel='http://schemas.google.com/g/2005#post' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/jose.perez.martinez%40gmail.com/full' />
  <link rel='http://schemas.google.com/g/2005#batch' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/jose.perez.martinez%40gmail.com/full/batch' />
  <link rel='self' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/jose.perez.martinez%40gmail.com/full?max-results=1' />
  <link rel='next' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/jose.perez.martinez%40gmail.com/full?start-index=2&max-results=1' />
  <author>
    <name>José Pérez Martínez</name>
    <email>jose.perez.martinez@gmail.com</email>
  </author>
  <generator version='1.0' uri='http://www.google.com/m8/feeds'>Contacts</generator>
  <openSearch:totalResults>616</openSearch:totalResults>
  <openSearch:startIndex>1</openSearch:startIndex>
  <openSearch:itemsPerPage>1</openSearch:itemsPerPage>
  <entry>
    <id>http://www.google.com/m8/feeds/contacts/jose.perez.martinez%40gmail.com/base/0</id>
    <updated>2011-02-23T13:06:29.313Z</updated>
    <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact' />
    <title type='text'>Alejandro Soler</title>
    <link rel='http://schemas.google.com/contacts/2008/rel#edit-photo' type='image/*' href='https://www.google.com/m8/feeds/photos/media/jose.perez.martinez%40gmail.com/0/jLnPaGKk4gRrJJff1sWXhg' />
    <link rel='http://schemas.google.com/contacts/2008/rel#photo' type='image/*' href='https://www.google.com/m8/feeds/photos/media/jose.perez.martinez%40gmail.com/0' />
    <link rel='self' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/jose.perez.martinez%40gmail.com/full/0' />
    <link rel='edit' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/jose.perez.martinez%40gmail.com/full/0/1298466389313000' />
    <gd:email rel='http://schemas.google.com/g/2005#other' address='kirth.asf@gmail.com' primary='true' />
  </entry>
</feed>

Notad que la gestión del token para obtener esta información es responsabilidad del usuario. PAra saber más leed la referencia [2]

Postscriptum: Más adelante escribiré una entrada sobre el API de Google y el protocolo de autorización OAuth2.

Referencias

  1. Google Contacts API version 3.0:https://developers.google.com/google-apps/contacts/v3/?csw=1
  2. Using OAuth 2.0 for Web Server Applications: target=”_blank”>https://developers.google.com/accounts/docs/OAuth2WebServer
  3. Tidy man page: http://tidy.sourceforge.net/docs/tidy_man.html

CHMOD: Cambiar los permisos de todos los directorios o sólo de ficheros

Hoy me he instaldo el Android Studio para cacharrear un par de aplicaciones que estoy probando. Como uso linux me he descargado el fichero TGZ del servidor de Google. Google sugiere que lo descomprimas donde quieras, pero claro a mi me gusta ser ordenado.

Podrías ponerlo en mi carpeta $HOME pero no creo que se muy correcto. Prefiero situarlo en el directorio /opt, claro debo descomprimirlo y a todos los directorios les doy permiso 775. ¿Cómo hacerlo de un plumazo? He pensado que es una buena ocasión para poner un par de ejemplos.

Modificar los permisos de los ficheros según su tipo:

  • Directorios:
    find /home/pruebas -type d -exec chmod -R 775 {} \;
  • Ficheros regulares (del mismo modo, pero …):
    find /home/pruebas -type f -exec chmod -R 775 {} \;

Para más opciones leed la referencia que adjunto.

Referencias

Página de manual del comando find: http://unixhelp.ed.ac.uk/CGI/man-cgi?find