Ludovic ROLAND

Blog technique sur mes expériences de développeur.

Android : Appeler un webservice

29 novembre 2011

Peu importe son support (iOS, Android, WP7), les applications téléphoniques ont toutes un point commun : elles utilisent très souvent un web service.

Dans cet article, nous allons donc voir comment récupérer les informations d’un web service afin de les exploiter dans votre application Android.

Qu’est ce qu’un web service ?

Dans la plupart des cas, les web services fournissent les données au format JSON ou XML, comme c’est le cas du web service que nous allons utiliser pour notre exemple : l’API Twitter.

L’API Twitter

L’API Twitter permet d’avoir accès aux tweets de n’importe quel compte le tout au format XML.

Les informations sont accessibles à l’adresse http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=UserUser est bien évidemment à remplacer par le nom du compte auteur des tweets que vous souhaitez consulter.

Comme vous pouvez le voir, la balise racine du fichier XML est la balise <statuses>. Chaque tweet est quant à lui représenté par une balise <status>. L’API est très complète et permet de connaître à chaque fois le contenu du tweet (balise <text>), la date de ce dernier (la balise <created_at>), ainsi que d’autres informations comme par exemple s’il s’agit d’un retweet (balise <retweeted>) et toutes les informations concernant l’auteur du tweet (balise <user>).

L’implementation JAVA

Pour faire simple, nous allons dans notre exemple uniquement récupérer le contenu des tweets. Nous allons donc nous intéresser à la balise <text>.

A noter, que j’ai choisi d’utiliser l’API DOM pour une question d’affinité.

Appel du web service

Dans un premier temps, nous allons commencer par “préparer le terrain” puis nous appellerons notre web service :

//On instancie le constructeur de parseur
DocumentBuilderFactory _factory = DocumentBuilderFactory.newInstance();

//On choisit d'ignorer les éventuels commentaires
_factory.setIgnoringComments(true);

//Création du parseur
DocumentBuilder _db = _factory.newDocumentBuilder();

//Chargement du document
Document doc = _db.parse(new URL("http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=User").openStream());

//Normalisation des données
doc.getDocumentElement().normalize();

Exploitation des donnees

Il est maintenant temps de passer à l’exploitation des données chargées dans l’étape précédente.

//On récupère toutes les balises <status>;
NodeList nodeLst = doc.getElementsByTagName("status");

//On boucle sur les balises <status>
for(int i=0; i<nodeLst.getLength(); i++) {
  //On récupère la balise <status> courante
  Node node = nodeLst.item(i);

  //On vérifie qu'on est bien sur une balise
  if(node.getNodeType() == Node.ELEMENT_NODE) {
    //On caste le Node en Element
    Element elt = (Element) node;

    //On récupère la balise <text>
    Element eText = (Element)elt.getElementsByTagName("text").item(0);

    //On récupère le texte de la balise <text>
    Node nText = eText.getFirstChild();

    //On affiche le tweet
    System.out.println(nText.getNodeValue());
  }
}

Libre à vous maintenant de stocker les informations dans une Collection et de l’exploiter ensuite dans votre Activity.

Le code complet

Pour ceux qui en auraient besoin, voici le code complet du programme que nous venons d’écrire.

import java.net.URL;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Twitter {
  public static void main(String[] args) {
    try {
      //On instancie le constructeur de parseur
      DocumentBuilderFactory _factory = DocumentBuilderFactory.newInstance();

      //On choisit d'ignorer les éventuels commentaires
      _factory.setIgnoringComments(true);

      //Création du parseur
      DocumentBuilder _db = _factory.newDocumentBuilder();

      //Chargement du document
      Document doc = _db.parse(new URL("http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=SEPEFREI").openStream());

      //Normalisation des données
      doc.getDocumentElement().normalize();

      //On récupère toutes les balises <status>
      NodeList nodeLst = doc.getElementsByTagName("status");

      //On boucle sur les balises <status>;
      for(int i=0; i<nodeLst.getLength(); i++) {
        //On récupère la balise <status> courante
        Node node = nodeLst.item(i);

        //On vérifie qu'on est bien sur une balise
        if(node.getNodeType() == Node.ELEMENT_NODE) {
          //On caste le Node en Element
          Element elt = (Element) node;

          //On récupère la balise <text>
          Element eText = (Element)elt.getElementsByTagName("text").item(0);

          //On récupère le texte de la balise <text>
          Node nText = eText.getFirstChild();

          //On affiche le tweet
          System.out.println(nText.getNodeValue());
        }
      }
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }
}

A lire aussi

Commentaires