Android Interroger un Web Service Json Contenu 1) Contexte... 2 A. La base MYSQL... 2 B. La ressource PHP (web service)... 2 C. La classe métier associée... 2 2) Interroger le web service... 3 A. Fonctionnement depuis l application Android... 3 B. Les AsyncTask... 3 doinbackground... 3 onpostexecute... 3 C. Requête http... 3 Exemple Get... 3 Exemple Post... 5 D. Les sessions... 5 3) Communication entre les 2 Thread... 5 4) Transformation Des trucs... 5 5) Résultats... 6
1) Contexte Nous allons voir ici comment récupérer des données contenues dans une base de données intranet par le biais d un service web accessible d Internet. Les informations transiteront sous forme d objets JSON, facilement manipulable par le langage Php et les terminaux mobiles Android. A. La base MYSQL La base de données interne contient une table «truc». Cette table est constituée de 2 champs : idtruc : un identifiant clé primaire de la table (int) libtruc : un libellé quelconque (varchar(45)) B. La ressource PHP (web service) Elle est à l adresse suivante : http://10380.sio.jbdelasalle.com/~amedassi/testws/index.php Elle crée une instance d un objet PDO afin d interroger la base Mysql si besoin. Selon la valeur de la variable (en GET) «uc», elle va interroger la bd et retourner le résultat encode en JSON. http://10380.sio.jbdelasalle.com/~amedassi/testws/index.php?uc=gettrucs Renvoie : C est l encodage JSON du contenu de la table «truc» : (Select * from truc) C. La classe métier associée Du côté de notre client Android, il semble plus pratique de créer l équivalent de notre table truc. Soit la classe Truc : Cette classe contient un constructeur standard, les getters, est une surcharge de tostring nécessaire à l affichage dans un listview par exemple. Elle contient également une méthode trucfactory statique, qui prend en paramètre un objet JSONObject et retourne un Truc. Elle peut également contenir une méthode trucsfactory statique qui prend en paramètre un objet JSONArray et retourne un ArrayList<Truc>.
2) Interroger le web service A. Fonctionnement depuis l application Android Une requête http met un certain temps à s exécuter. L application de doit pas être «bloquée» le temps que la requête ne récupère le résultat demandé. Pour cela, la requête http doit s exécuter dans un Thread différent du Thread principal de l application. La classe qui va gérer l exécution de la requête http doit donc implémenter l interface AsyncTask, afin d être exécutée en parallèle. B. Les AsyncTask Comme son nom l indique, une AsyncTask permet de réaliser des tâches de manière asynchrone, à la manière de la classe Thread. L avantage de l AsyncTask est sa simplicité d utilisation et d implémentation. Le Thread secondaire est créé automatiquement et la communication entre les différents Thread est simplifiée. doinbackground La méthode doinbackground de l interface AsyncTask est appelée à l appel de execute sur l objet AsyncTask. Elle contient le code à exécuter dans un autre Thread. onpostexecute La méthode onpostexecute de l interface AsyncTask est appelée après la fin de l execution du Thread parallèle. Elle doit contenir le code à exécuter quand la tâche asynchrone est terminée. Dans notre cas, elle sera exécutée une fois la réponse http récupérée. C. Requête http Depuis peu, un nouveau client http (non intégré à l API Android) est conseillé, laissant obsolète le client http de l API Java. Il s agit d okhttp de square open source. Afin de pouvoir l utiliser, il suffit d intégrer la librairie à Android Studio. Exemple Get
Exemple Post D. Les sessions Dans le cas où une identification protège le web service, il sera très certainement nécessaire de garder une session web ouverte sur le serveur http. Pour cela, en plus de n utiliser qu une seule instance de notre objet web, il faut également spécifier au clienthttp de conserver le manger de cookies : 3) Communication entre les 2 Thread Comment notre AsyncTask va-t-elle prévenir le programme principal que la requête est terminée? Pour que l AsyncTask puisse appeler une méthode de l Activity, il faut que l AsyncTask connaisse la référence de l Activity. Une autre solution serait de créer un Handler connu des 2 classes. C est exactement le travail d un objet Handler. A la construction de l objet Threadé, on lui passe la référence de l objet appelant afin que l objet Threadé puisse prévenir l Objet du Thread principal quand le travail sera terminé. L AsyncTask doit exécuter la requête (ici GET). Elle récupère le résultat de la requête dans un String qui contient la chaîne de caractère attendue. Une fois cette chaîne récupérée, elle peut interpréter son contenu (un/des objets JSON) et prévenir le Thread principal par le biais de l Handler ou bien d une méthode de l Activity que le travail est fini et qu elle peut venir récupérer le résultat quand elle le souhaite. 4) Transformation Des trucs La réponse de la requête peut-être maintenant traitée. Le constructeur de JSONArray va nous permettre de transformer la chaîne de caractères (réponse de la requête) en tableau de JSONObjet. Puis, grâce à la méthode statique trucfactory de la classe Truc, nous allons pouvoir générer nos objets Truc afin de les stocker dans un ArrayList. L ArrayList n a plus qu à être chargé dans un ListView par exemple.
5) Résultats