Blog technique sur mes expériences de développeur.
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.
Un service web (ou service de la toile) est un programme informatique permettant la communication et l’échange de données entre applications et systèmes hétérogènes dans des environnements distribués. Il s’agit donc d’un ensemble de fonctionnalités exposées sur internet ou sur un intranet, par et pour des applications ou machines, sans intervention humaine et de manière synchrone. Wikipédia
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 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=User où User 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>
).
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é.
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();
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.
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();
}
}
}