You are on page 1of 27

COMMUNICATION ENTRE

ANDROID ET PHP/MYSQL
Andr0
16 juillet 2016

Table des matires


1 Introduction

2 Pourquoi utiliser un serveur ?

2.1 Un serveur est ncessaire partir de quand ? . . . . . . . . . . . . . . . . . . . .

2.2 Quest-ce quune API ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.3 Fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.4 Le choix entre un serveur ddi ou une plateforme de conception . . . . . . . . . .

2.4.1 Une base de donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10

2.4.2 Applicatif

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10

2.4.3 Utiliser une plateforme de conception . . . . . . . . . . . . . . . . . . . .

10

3 Mise en place du serveur applicatif PHP


3.1 Configuration de la base de donnes

13

. . . . . . . . . . . . . . . . . . . . . . . .

13

Pr-requis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

3.1.2 Configuration de la table . . . . . . . . . . . . . . . . . . . . . . . . . . .

14

3.1.1

3.2 Quest-ce quune rponse en JSON ?

. . . . . . . . . . . . . . . . . . . . . . . .

15

3.2.1 Dfinition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15

. . . . . . . . . . . . . . . . . . . . . . . . . .

15

3.3 Dveloppement du serveur applicatif . . . . . . . . . . . . . . . . . . . . . . . .

3.2.2 Les diffrentes structures

17

3.3.1

Script de lapplication serveur . . . . . . . . . . . . . . . . . . . . . . . .

17

3.3.2 Solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

18

4 Rcuprer les donnes distantes


4.1 Une requte HTTP standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

19
19

4.2 Extraire les donnes du JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20


4.2.1 Extraire un tableau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.2.2 Extraire un objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

21

4.2.3 Extraire les donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

21

4.3 Facilitons-nous la vie avec des bibliothques . . . . . . . . . . . . . . . . . . . .

23

4.3.1 OkHttp et Gson


4.3.2 Retrofit

5 Conclusion

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25

27

1 Introduction
De nombreux dbutants ne savent pas comment faire communiquer une base de donnes distante MySQL avec une application cliente du type Android. Ce tutoriel tente de rpondre cette
question o la rponse est bien loin dtre simple. Des rponses des questions transverses sont
ncessaires et cest facile de tomber dans certains piges quand on ne dispose pas de lexprience
requise dans le domaine.
Lexprience requise, parlons-en ! Ce tutoriel se veut accessible aux plus dbutants mais se
concentre en grande partie sur le dveloppement Android et lgrement sur le dveloppement
serveur. Dailleurs, il nest pas conseill dadopter les exemples de la partie serveur de ce tutoriel
dans un environnement de production pour des raisons de maintenance et de qualit de code.
Cette partie serveur tente simplement de vous expliquer les grandes lignes de son fonctionnement et donne un exemple fonctionnel. Les bonnes pratiques sont mentionnes et expliques,
mais elles ne sont pas enseignes. Cet enseignement demanderait un cours entier sur le sujet o
dautres ressources sur Internet les expliqueront bien mieux.
Les connaissances indispensables sont les suivantes :
Savoir crer un projet Android et lexcuter : ressource crite ou ressource multimdia.
Savoir crer une base de donnes MySQL : ressource crite.
Savoir excuter du code PHP : ressource crite pour les utilisateurs Windows ou ressource
crite pour tous les utilisateurs.
Les connaissances optionnelles sont les suivantes :
Avoir une connaissance basique des communications entre un serveur et des clients.
Savoir faire des requtes HTTP depuis une application Android.
Lier un serveur applicatif en PHP avec une base de donnes MySQL.
Ces dernires connaissances sont optionnelles parce quelles seront expliques dans ce tutoriel
pour que vous ne soyez pas perdu. Si vous ne disposez pas de ces connaissances, aucun inquitude
avoir. Vous pourrez quand mme suivre ce tutoriel et disposez des mme connaissances quun
autre lecteur disposant de ces connaissances.
Sur ce, ne perdons plus de temps et lanons nous dans cette communication entre une application
Android et un serveur applicatif PHP/MySQL !

2 Pourquoi utiliser un serveur ?


Une architecture client/serveur est un mode de communication un peu obscur pour les dbutants,
juste titre. En effet, partir du moment o vos applications ont besoin dun serveur, elles commencent prendre de limportance. Il faut y centraliser les donnes pour permettre dautres
clients de les rcuprer. Ce genre darchitecture est maintenant de plus en plus courante et donc,
de plus en plus rare de fonctionner uniquement avec des bases de donnes locales.

2.1 Un serveur est ncessaire partir de quand ?


Le principal objectif dun serveur est la centralisation des donnes et permettre plusieurs clients
de les rcuprer et dy contribuer. Plusieurs scnarios existent pour vous poser la question de sa
ncessit :
Dveloppez-vous une application sur plusieurs plateformes (Android, iOS, Windows
Phone, site web, etc.) avec les mmes donnes ? Par exemple, si lobjectif de lapplication
est la gestion dune liste de tches faire (couramment appele une todo list), il serait dommage de ne pas partager ces listes sur toutes les plateformes travers les applications,
mobiles ou non, que vous avez dveloppes. Si une tche est rajoute sur lapplication
Android, elle doit tre rajoute sur le site web.
Dsirez-vous ouvrir certaines de vos donnes des services tiers ? Cest une pratique
courante. Par exemple, la plateforme Zeste de Savoir enregistre chaque jour de plus en plus
de donnes, la plupart sont des donnes publiques et/ou sous une licence libre. Zeste de
Savoir a mit en place une API (explique plus loin dans ce cours) qui permet son utilisation
dans des applications tierces nayant pas forcment un rapport avec Zeste de Savoir.
Il existe dautant plus de scnarios quand lon se trouve dans le cadre professionnel. Les entreprises ont des besoins et des contraintes hautement plus complexes avec des architectures prcises. Elles sont souvent murement rflchies par ses dirigeants et/ou ses employs.

2.2 Quest-ce quune API ?


Une API, ou Application Programming Interface, est, comme son nom lindique, une interface dun
programme applicatif informatique. Elle permet doffrir des services et des ressources sur base
dun systme dj existant. En fait, ces ressources sont des donnes exposes selon certaines
conditions dfinies par vos soins. Vous restez maitre de vos donnes et appliquez la politique
souhaite pour dfinir les donnes publiques ou prives.

2 Pourquoi utiliser un serveur ?

Figure : Les services sur Internet sont accessibles par des interfaces quand vous utilisez votre ordinateur. Crdit : Eran Mendel, tukinon sur Flickr.

Cette pratique nest pas obligatoire. Pour le projet illustrant ce tutoriel, il ny aura pas dutilisation dune API, malheureusement, puisque nous resterons simple du ct serveur. Ce nest pas
lobjectif de notre cours mais cest une pratique sur laquelle je vous encourage vous renseigner.
Sachez tout de mme quil existe 2 grandes familles dans ce domaine :

REST : Architecture oriente ressource, une API REST offre une interface simple et uniforme. Elle est particulirement bien adapte au web mais elle nen est pas dpendante.
Sa souplesse et sa mise en place rapide est une trs grande force par rapport son concurrent direct.
SOAP : Permet la transmission de messages entre des objets distants. Il est alors possible
un objet dappeler directement des mthodes sur un serveur. Cependant, il est bti sur
lXML et moins sur le JSON, nouveau format de donnes particulirement utilis par
REST.

Pour un dbutant, le REST me semble tout indiqu et les ressources (franaise et anglaise) regorgent sur le sujet sur la Toile. Soyez curieux !

2.3 Fonctionnement

Les explications qui vont suivre sont largement simplifies pour tre accessibles aux dbutants
mais elles nen restent pas moins vridiques et suffisantes pour la comprhension de ce qui va
suivre dans ce tutoriel.

2.4 Le choix entre un serveur ddi ou une plateforme de conception

Figure : Fonctionnement dune architecture client-serveur


Comme vous pouvez le constater, nos clients (les ordinateurs, les smartphones, les tablettes, etc.)
font des requtes HTTP (les flches pleines) vers des serveur en passant par la Toile, Internet. Ces
requtes nont rien de plus spcial quune requte HTTP que vous feriez partir dun navigateur
web. Vous spcifiez une URL et vous vous attendez recevoir une rponse (les flches vides).
Une fois que la requte est arrive destination, il passe dabord par lAPI (ce nest pas obligatoire,
mais soyons complets dans notre exemple). Cette API possde une procdure qui associera la
forme de votre URL une action raliser (gestion dune ressource dans REST, opration mtier
dans SOAP). LAPI va alors lexcuter et dialoguer avec le serveur pour rcuprer les donnes. Elle
rcupre le rsultat et le formate dans un format de donnes comme lXML, le JSON ou lHTML.
Notre client reoit alors la rponse sa requte et peut la traiter comme bon lui semble. Si nous
sommes sur un navigateur, nous obtiendrons une rponse HTML que nous pourrons afficher
lcran (parce que nous avons spcifi dans la requte que nous dsirons une rponse en HTML).
Si nous sommes sur des appareils mobiles, nous pourrons obtenir une rponse XML ou JSON pour
pouvoir utiliser les donnes comme nous le dsirons. Nous pourrions demander au serveur une
rponse HTML mais cela ne serait pas forcment pertinent pour un client mobile.
Grce ce procd, le serveur permet une totale abstraction de son langage 1 , de son implmentation et noblige pas le client utiliser un langage spcifique pour pouvoir dialoguer avec lui. Ce
qui est le cas avec des technologies concurrentes du REST.

2.4 Le choix entre un serveur ddi ou une plateforme


de conception
Il existe plusieurs solutions pour dvelopper sa propre application serveur. Il ne sera pas expliqu
comment installer et configurer un serveur. Cependant, nous verrons les composants dun serveur quil faut obligatoirement installer pour possder un serveur simple mais fonctionnel. Cela
1. Une abstraction de langage, language agnostic en anglais, permet une communication entre deux langages diffrents qui ne sont pas forcment compatibles, cela grce un troisime langage destin faire le lien entre les
deux.

2 Pourquoi utiliser un serveur ?

grce diffrentes technologies possibles.

2.4.1 Une base de donnes


Toutes vos donnes sont contenues dans une base de donnes. Il existe plusieurs types de SGBD
(Systme de Gestion de Base de Donnes) et elles ont toutes leurs subtilits. Libre vous de choisir celle que vous prfrez. Vous pouvez donc utiliser SQLite, MySQL, PostgreSQL, Oracle, etc. Cependant, suivant ce que vous allez choisir pour dvelopper votre application serveur, vous devez
vous renseigner si le langage supporte le SGBD que vous avez choisi. Pour les plus connus, cela
ne devrait pas poser problme mais pour les moins, il est toujours utile de vrifier.

2.4.2 Applicatif
2.4.2.1 PHP
Les applications serveur peuvent tre dveloppes dans de nombreux langages, y compris par des
langages utiliss pour dvelopper des sites web en temps normal comme le PHP. Dans le cadre
de ce tutoriel, nous allons utiliser ce langage pour fournir une application serveur fonctionnelle
rapidement et facilement comprhensible par les dbutants.
Le langage a beaucoup volu et des frameworks comme Symfony 2 sont apparus. Avec eux, des architectures plus volues qui simplifient le dveloppement dapplications serveur actuelles. Pour
plus dinformation sur Symfony 2 et sur le dveloppement de routes permettant de fournir une
API donnant accs aux donnes, rendez-vous sur ce tutoriel.

2.4.2.2 Java
Le java est lun des langages les plus utiliss pour le dveloppement dapplications serveur via des
EJB (Entreprise JavaBeans). EJB est une architecture de composants logiciels ct serveur pour la
plateforme de dveloppement J2EE. Grce un serveur dapplication comme JBoss, Glassfish et
dautres, il est possible de dployer des applications serveur dfinissant des routes pour accder
aux diffrentes ressources que vous dsirez offrir.
Cependant, ces solutions sont plutt lourdes et ne conviennent pas aux petits projets. Cest pourquoi ces diffrentes technologies sont trs demands en entreprise pour satisfaire leurs besoins
en performance et en maintenance contrairement aux petits sites web amateurs.

2.4.2.3 Autres
Bien sr, il existe beaucoup dautres langages qui permettent de dvelopper des applications serveur comme NodeJS, C#, Scala, Python, etc.

2.4.3 Utiliser une plateforme de conception


Vous ntes pas oblig de partir dune feuille blanche. Il existe des solutions qui vous permettent
de dmarrer partir dun serveur pr-configur o toute une srie de services dun serveur sont
abstraits. Des outils sont mis la disposition des dveloppeurs pour une meilleure gestion et une
maintenance.

10

2.4 Le choix entre un serveur ddi ou une plateforme de conception

Lun des plus connus est Google App Engine. Grce une simple application Web en Python, Java
ou Go, vous pouvez confectionner rapidement un serveur que vous pourrez utiliser en dveloppement ou en production. Il faut tout de mme savoir que ce genre de solutions sont souvent
payantes, Google App Engine nchappe pas cette rgle.

11

3 Mise en place du serveur applicatif


PHP
Dans un souci de simplicit, le serveur applicatif sera dvelopp par des scripts PHP ; cest--dire
que nous ne dvelopperons pas avec un framework ou une solution toute faite pour faciliter le
dveloppement dune API. Cela ncessiterait lcriture dun tutoriel part entire. Dautres sont
dj rdigs sur la plateforme Zeste de Savoir. Ce qui sera enseign ici nest que le strict minimum
pour pouvoir tre utilisable depuis une application mobile Android.

3.1 Configuration de la base de donnes


Lexemple est extrmement simple. Le plus important ne concerne pas les donnes ni la manire
dont elles sont envoyes mais comment les rcuprer et les traiter. Cest pourquoi nous allons
limiter notre applicatif une seule URL qui dlivrera une liste de produits dans un format JSON
(JSON tant un concept qui sera abord plus loin dans ce tutoriel).

3.1.1 Pr-requis
Nous devons installer quelques outils et savoir utiliser quelques concepts hors du dveloppement
Android. Je nexpliquerais pas comment les installer ni comment les utiliser. Il existe dautres
tutoriels qui vous expliqueront comment faire bien mieux que moi. Je vous renvoie aux chapitres
des tutoriels suivants :
Le chapitre Prparer son ordinateur du tutoriel Concevez votre site web avec PHP et MySQL
de Mateo21 pour installer votre serveur PHP.
Le chapitre Prsentation des bases de donnes du tutoriel Concevez votre site web avec
PHP et MySQL de Mateo21 si vous voulez bien comprendre comment lier une application
PHP une base de donnes MySQL.
Le chapitre phpMyAdmin du tutoriel Concevez votre site web avec PHP et MySQL de Mateo21 pour utiliser correctement le gestionnaire de bases de donnes de MySQL.
Le chapitre Cration dune base de donnes du tutoriel Administrez vos bases de donnes
avec MySQL de Taguan pour crer une base de donnes dans PhpMyAdmin.
Le chapitre Cration de tables du tutoriel Administrez vos bases de donnes avec MySQL
de Taguan pour crer facilement une table dans votre base de donnes.
Le chapitre Insertion de donnes du tutoriel Administrez vos bases de donnes avec MySQL
de Taguan pour insrer des valeurs dans votre table.
Ne prenez pas peur ! Mme si cela fait beaucoup de chapitres, dune part, je suis certain que la
plupart dentre vous connaissent dj toutes ces notions (mme vaguement) et dautre part, il
nest pas ncessaire dtre un expert dans ces domaines. Une connaissance basique est suffisante
pour ne pas tre perdu dans la suite des explications de ce tutoriel.

13

3 Mise en place du serveur applicatif PHP

3.1.2 Configuration de la table


Vous devriez avoir tous les outils et tous les concepts pour installer et configurer correctement
votre serveur PHP. Pour pouvoir suivre sereinement et efficacement les exemples qui suivent,
voici la spcification de lunique table de notre base de donnes :
[[information]] | Libre vous de choisir une spcification diffrente mais il faudra la rpercuter
dans le code de votre applicatif PHP et Android par la suite.
Concept

Nom

Base de donnes

AdvancedAndroidDevelopment

Table

product

Colonnes
ID
NAME
TYPE
PRICE

Pour vous faciliter la vie, les requtes SQL ci-dessous vous permettront de crer la table product
et dinsrer quelques donnes factices que nous allons rcuprer dans notre application Android
dans la prochaine section.

--- Structure de la table `product`


-CREATE TABLE IF NOT EXISTS `product` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`NAME` varchar(50) NOT NULL,
`TYPE` varchar(50) NOT NULL,
`PRICE` double NOT NULL,
PRIMARY KEY (`ID`)
);
--- Contenu de la table `product`
-INSERT INTO `product` (`ID`, `NAME`, `TYPE`, `PRICE`) VALUES
(1, 'Apple', 'Fruit', 1.2),
(2, 'Pear', 'Fruit', 1.3),
(3, 'Banana', 'Fruit', 1.1),
(4, 'Mushroom', 'Vegetable', 2.7),
(5, 'Pepper', 'Vegetable', 3.6);

14

3.2 Quest-ce quune rponse en JSON ?

3.2 Quest-ce quune rponse en JSON ?


Comme dit prcdemment, notre serveur ne sera pas dvelopp avec une API. la place, lURL
expose pointera vers un script PHP qui se chargera deffectuer la requte SQL adquate pour
rcuprer les produits en base de donnes et de les renvoyer dans le format JSON.
Si vous ne connaissez pas le JSON, cest une bonne occasion den savoir un peu plus. Si vous tes
dj un dveloppeur Android, vous connaissez bien lXML puisquil sagit du langage de balisage
utilis pour la confection des interfaces mais le JSON est diffrent dans sa syntaxe et dans sa
philosophie.

3.2.1 Dfinition
Voici une courte dfinition que vous retrouvez sur le site officiel de JSON (dont il existe une version
franaise) :
JSON (JavaScript Object Notation Notation Objet issue de JavaScript) est un format
lger dchange de donnes. Il est facile lire ou crire pour des humains. Il est aisment analysable ou gnrable par des machines. Il est bas sur un sous-ensemble du
langage de programmation JavaScript (JavaScript Programming Language, Standard
ECMA-262 3rd Edition - December 1999). JSON est un format texte compltement
indpendant de tout langage, mais les conventions quil utilise seront familires
tout programmeur habitu aux langages descendant du C, comme par exemple : C
lui-mme, C++, C#, Java, JavaScript, Perl, Python et bien dautres. Ces proprits
font de JSON un langage dchange de donnes idal. Source : json.org
Comme la dfinition le mentionne, le principal avantage de ce format texte est sa totale indpendance du langage. Cest pourquoi, mme si notre application serveur est dveloppe en PHP,
nous pouvons sans problme dvelopper nos clients dans un autre langage (dans notre cas, en
Java puisque nous dveloppons sur Android). Ce nest pas le seul avantage de ce format. Nous
pouvons en citer dautres depuis cet extrait :
Sa simplicit dans sa mise en oeuvre. Aujourdhui, tous les langages supportent ce format
et proposent des solutions pour construire et lutiliser.
Sa lisibilit aussi bien par les humains que par les machines puisque le langage est peu
verbeux.
Sa syntaxe est rduite et non extensible ce qui le rend facile apprendre pour lhumain.

3.2.2 Les diffrentes structures


Les structures dun fichier JSON sont extrmement simples et se reprsentent que de 3 manires
diffrentes :
Objet : Fonctionne sur le principe de cl valeur quil est possible de dclarer plusieurs fois
les uns la suite des autres.
Tableau : Reprsente un tableau de valeurs qui peuvent tre aussi bien des objets, des tableaux ou des valeurs simples.
Valeur : Reprsente simplement une valeur qui peut tre une chane de caractres, un
nombre, un boolen, une valeur null ou mme un objet ou un tableau. Raison pour laquelle
un tableau peut contenir des objets et des tableaux et rciproquement pour un objet.

15

3 Mise en place du serveur applicatif PHP

Ainsi, toutes ses reprsentations se schmatisent de la manire suivante avec cette image issue
du site officiel du JSON.

Figure : Description de son langage dans son intgralit


La lecture de ce genre de reprsentation est enfantine, il suffit de suivre les branches. Pour vous
aider comprendre, prenons le schma flch ci-dessous. Les flches mettent en vidence les
branchements possibles et les arrts une valeur obligatoire.

Figure : Ecriture dun objet partir de la reprsentation du JSON

1. Nous commenons notre objet et nous sommes obligs dcrire une accolade. Cest cette
accolade qui va marquer le dbut dun objet JSON.
2. Si nous prenons cette branche et que nous la suivons, nous vitons de renseigner des
cls/valeurs dans notre objet pour directement le fermer. Cela veut donc dire quil est
possible de crer des objets vides mais que la suite dune dclaration dun objet. Ds que
vous aurez renseign au moins une cl/valeur, votre objet JSON ne pourra plus tre vide,
chose assez logique.
3. Nous dcidons de renseigner une cl/valeur dans notre objet. Nous rencontrons un encadr
qui reprsentera notre cl, nous devons renseigner : pour faire correspondre la cl la
valeur et nous renseignons la valeur.
4. Nous pouvons ritrer la branche 3 autant de fois que nous le dsirons. Pour ce faire, vous
prenez la branche 4 qui vous oblige renseigner une virgule avant de retourner sur la
branche prcdente.
5. Ds que vous avez fini de renseigner toutes les cls/valeurs de votre objet, vous sortez avec
la branche 5 en renseignant une accolade fermante.

Voyons un exemple concret avec le dveloppement du serveur applicatif.

16

3.3 Dveloppement du serveur applicatif

3.3 Dveloppement du serveur applicatif


3.3.1 Script de lapplication serveur
Vous avez toutes les cartes en main pour dvelopper votre application serveur. Il ne vous reste
plus qu dvelopper votre script qui va :
Se connecter votre base de donnes, AdvancedAndroidDevelopment ;
Excuter la requte SQL de slection de votre choix pour rcuprer les produits ;
Former un tableau dobjets pour le prparer au format JSON ;
Utiliser la mthode string json_encode ( mixed $value [, int $options = 0

] ) pour encoder votre tableau en JSON (documentation officielle) ;


Utiliser la mthode void echo ( string $arg1 [, string $... ] ) pour envoyer
le fichier JSON au client (documentation officielle).
Vous savez quoi faire et je vais vous laisser faire. Il est important que vous y parveniez seul pour
pouvoir dvelopper vos propres scripts. Notre exemple est assez simple et ne devrait pas poser
problme mais si vous prouvez des difficults, rendez-vous sur des tutoriels PHP pour vous dbloquer. Essayez de trouver la solution par vous-mme avant de regarder la solution propose.
lexcution du script, le JSON que vous devez obtenir est un tableau avec pour chaque indice, un
objet qui reprsentera un produit :

[
{
"id" :"1",
"name" :"Apple",
"type" :"Fruit",
"price" :"1.2"
},
{
"id" :"2",
"name" :"Pear",
"type" :"Fruit",
"price" :"1.3"
},
{
"id" :"3",
"name" :"Banana",
"type" :"Fruit",
"price" :"1.1"
},
{
"id" :"4",
"name" :"Mushroom",
"type" :"Vegetable",
"price" :"2.7"
},
{
"id" :"5",

17

3 Mise en place du serveur applicatif PHP

"name" :"Pepper",
"type" :"Vegetable",
"price" :"3.6"
}
]

3.3.2 Solution

<?php
try {
// connection to the database.
$pdo_options[PDO ::ATTR_ERRMODE] = PDO ::ERRMODE_EXCEPTION ;
$bdd = new PDO('mysql:host=localhost;dbname=AdvancedAndroidDevelopment', 'root'
// Execute SQL request on the database.
$sql = 'SELECT id, name, type, price FROM product;' ;
$response = $bdd->query($sql);
$output = $response->fetchAll(PDO ::FETCH_ASSOC));
} catch (Exception $e) {
die('Erreur : ' . $e->getMessage());
}
// Print JSON encode of the array.
echo(json_encode($output));
?>

18

4 Rcuprer les donnes distantes


4.1 Une requte HTTP standard
Parmi toutes les API Java intgres dans le framework Android, il existe le paquetage java.net
pour effectuer des requtes HTTP standard ; cest--dire sans lintervention dune bibliothque
externe.
Lusage des classes de ce paquetage implique la configuration totale de vos requtes HTTP de la
mthode utilise, aux diffrents timeout et ncessite la conversion manuelle dun flux de donnes
une chaine de caractre.
Pour rsum, si nous dsirons effectuer une requte HTTP du type GET, avec une limite de 10000
millisecondes pour lire la requte et de 15000 pour se connecter au serveur, vous devez initialiser
la requte de la manire suivante :

public String get(String url) throws IOException {


InputStream is = null ;
try {
final HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setReadTimeout(10000 /* milliseconds */);
conn.setConnectTimeout(15000 /* milliseconds */);
conn.setRequestMethod("GET");
conn.setDoInput(true);
// Starts the query
conn.connect();
is = conn.getInputStream();
// Read the InputStream and save it in a string
return readIt(is);
} finally {
// Makes sure that the InputStream is closed after the app is
// finished using it.
if (is != null) {
is.close();
}
}
}
Code : Requte HTTP vers un serveur une URL donne en paramtre.
la lecture de ce code, cela peut vous sembler pas bien complexe utiliser mais sachez quil sagit
ici du minimum syndical (et encore, il nest pas ncessaire de renseigner des timeout). Ds lors que
vous voudrez effectuer des requtes dans un projet srieux, il vous faudra ragir des codes HTTP
et traiter son contenu en fonction de ce mme code. Chose qui nest pas traite dans cet exemple,

19

4 Rcuprer les donnes distantes

ni mme dans ce tutoriel puisque nous verrons plus loin des usages plus courants et plus simples
pour effectuer des requtes.
Vous remarquez aussi lusage de la mthode readIt(InputStream) qui permet de lire un In-

putStream et den sauvegarder son contenu dans une String. Cette mthode nexiste pas dans
Android mais il existe plusieurs faons de mettre en oeuvre cette conversion. Voici la mienne :

private String readIt(InputStream is) throws IOException {


BufferedReader r = new BufferedReader(new InputStreamReader(is));
StringBuilder response = new StringBuilder();
String line;
while ((line = r.readLine()) != null) {
response.append(line).append('\n');
}
return response.toString();
}
Code : Lit un flux de donnes et place son contenu dans une chaine de caractres.
Cette section nest ici qu titre informatif et parce que vous pourriez rencontrer ce genre de code
dans dautres projets puisquil sagit de la version la plus basique possible pour faire une requte.
[[attention]] | Au risque de gler votre interface graphique ou de faire survenir un crash, il
faut obligatoirement faire une requte HTTP dans un thread secondaire. Vous disposez de
nombreuses possibilits pour excuter du traitement dans des threads secondaires comme les

AsyncTask, les Handler, les HandlerThread, les Loader ou les services. Ce sujet fera lobjet
dun tutoriel spar vu la diversit des possibilits et leurs nombreux avantages/inconvnients.

4.2 Extraire les donnes du JSON


Rappelez-vous, le serveur applicatif va chercher en base de donnes une liste de produits et renvoyer le rsultat dans un fichier JSON. Il faut donc pouvoir extraire les donnes de ce fichier et les
placer dans une classe pour pouvoir les afficher ou les manipuler dans lapplication. Pour y parvenir, nous allons dlguer la responsabilit dextraire les donnes une classe Product. Cela
permettra de ne plus se proccuper de lextraction des objets dun produit dans le fichier JSON.
Avant cela, nous allons en apprendre plus sur les classes principales, savoir JSONArray et JSO-

NObject.

4.2.1 Extraire un tableau


Pour extraire un tableau dun fichier JSON, vous devez utiliser la classe JSONArray qui possde 4
constructeurs :
public JSONArray () : Cration dun tableau JSON vide.
public JSONArray (Collection copyFrom) : Cration dun tableau JSON en copiant
toutes les valeurs de la collection donne.
public JSONArray (JSONTokener readFrom) : Cration dun tableau JSON en copiant
toutes les valeurs du tableau contenu dans le tokener.
public JSONArray (String json) : Cration dun tableau JSON suivant un fichier
JSON.

20

4.2 Extraire les donnes du JSON

Puisque notre requte HTTP lit un InputStream et sauvegarde son contenu dans une String, le
dernier constructeur est celui qui convient le mieux notre exemple. Concrtement, ce constructeur va crer un JSONArray et va contenir toutes les valeurs, les objets ou les tableaux contenus
dans le tableau racine. Notez que si le serveur applicatif avait renvoy non pas un tableau mais
un objet, il aurait fallu utiliser un des constructeurs de JSONObject.
Une fois que vous avez votre tableau JSON, une srie de mthodes existe pour en extraire les diffrentes valeurs. Nous avons dj vu les diffrentes valeurs contenues dans un fichier JSON, il
existe une mthode dextraction pour chacun de ces types :
public boolean getBoolean (int index) : Rcuprer une valeur boolenne.
public double getDouble (int index) : Rcuprer un double.
public int getInt (int index) : Rcuprer un entier.
public long getLong (int index) : Rcuprer un long.
public String getString (int index) : Rcuprer une chaine de caractres.
public JSONArray getJSONArray (int index) : Rcuprer un tableau JSON.
public JSONObject getJSONObject (int index) : Rcuprer un objet JSON.
[[information]] | Il existe une alternative chacune de ces mthodes. Le problme avec les mthodes get*(), il lancera une exception org.json.JSONException si vous tentez de rcuprer
une valeur qui nexiste pas. Vous pouvez donc utiliser les mthodes opt*() qui renverra une valeur par dfaut si la valeur nest pas prsente. Je vous encourage donc utiliser cette version si la
valeur nest pas forcment ncessaire et quune valeur par dfaut peut convenir.

4.2.2 Extraire un objet


Pour extraite un objet dun fichier JSON, cest similaire aux tableaux. Vous devez utiliser la classe

JSONObject qui possde 5 constructeurs :


public JSONObject () : Cration dun objet JSON vide.
public JSONObject (Map copyFrom) : Cration dun objet JSON qui copie toutes les
cls/valeurs de la map donne.
public JSONObject (JSONTokener readFrom) : Cration dun objet JSON qui copie
toutes les cls/valeurs du prochain objet dans le tokener.
public JSONObject (String json) : Cration dun objet JSON suivant un fichier
JSON.
public JSONObject (JSONObject copyFrom, String[] names) : Cration dun
objet JSON qui copie tous les noms du tableau avec lobjet JSON.
Tout comme linstanciation dun tableau JSON, nous utiliserons principalement le constructeur
qui prend une chaine de caractres en paramtre.
Quant aux mthodes dextraction, elles sont strictement identiques au JSONArray. Vous naurez
donc aucun mal les utiliser.

4.2.3 Extraire les donnes


La thorie est termine, nous allons passer la pratique. Lexemple tant assez simple, il ny
aura quune seule classe qui aura la responsabilit dextraire un JSONObject et de renseigner les
valeurs que contient cet objet dans les attributs de la classe, que nous appellerons une classe du
domaine nomme Product.

21

4 Rcuprer les donnes distantes

package org.randoomz.androidnetworkingsample.models;
import android.os.Parcel;
import android.os.Parcelable;
import org.json.JSONObject;
public class Product implements Parcelable {
private final long id;
private final String name;
private final String type;
private final double price;
public Product(JSONObject jObject) {
this.id = jObject.optLong("id");
this.name = jObject.optString("name");
this.type = jObject.optString("type");
this.price = jObject.optDouble("price");
}
public long id() { return id; }
public String name() { return name; }
public String type() { return type; }
public double price() { return price; }
}
Code : Considre comme une classe du modle, elle reprsente un produit.
Cependant, avant dobtenir les objets des produits, il faut itrer sur le tableau JSON qui se trouve
la racine du fichier JSON. Pour ce faire, nous allons rcuprer la chaine de caractres du JSON,
nous allons la placer dans un JSONArray et nous allons itrer dessus.

private List<Product> parse(final String json) {


try {
final List<Product> products = new ArrayList<>();
final JSONArray jProductArray = new JSONArray(json);
for (int i = 0 ; i < jProductArray.length(); i++) {
products.add(new Product(jProductArray.optJSONObject(i)));
}
return products;
} catch (JSONException e) {
Log.v(TAG, "[JSONException] e : " + e.getMessage());
}
return null ;
}

22

4.3 Facilitons-nous la vie avec des bibliothques

Code : Traduit une reprsentation en chaine de caractres dun fichier JSON en une liste de produits.
Vous disposez maintenant de la liste des produits et vous pouvez lutiliser nimporte o dans votre
application comme dans une liste.

4.3 Facilitons-nous la vie avec des bibliothques


Vous savez quoi ? Oubliez tout ce que nous venons dapprendre dans cette section, ou plus justement ne lutilisez plus jamais. Lune des forces dAndroid se situe dans sa communaut. Elle est
tellement norme et active quil existe des milliers de bibliothques pour aider les dveloppeurs
dans le dveloppement de leurs applications Android.
Dans le cadre de ce tutoriel, nous allons en apprendre 3 qui me semblent indispensables
connaitre pour tout dveloppeur Java. Java parce que ces bibliothques sont adaptes au dveloppement Android et Java standard.
[[information]] | Dans la suite de cette section, nous allons partir du principe que vous utilisez Android Studio et donc Gradle comme gestionnaire de dpendances. Toutes les dpendances seront
renseigner dans le fichier Gradle build.gradle.

4.3.1 OkHttp et Gson


Dans les exemples prcdents, nous avons appris utiliser les classes standards du framework
Android mais elles sont loin dtre ergonomique. Pour palier ce problme, nous allons voir deyx
bibliothques qui vont simplifier vos requtes HTTP et la transformation dune chaine de caractres dans des objets Java.
OkHttp est une bibliothque qui tente de proposer une solution moderne pour effectuer des requtes web. Son utilisation est extrmement simple et se dcoupe en 3 tapes :
1. Prparation de la requte HTTP grce au design pattern Builder.
2. Excution de la requte HTTP prcdemment prpare.
3. Rcupre le rsultat de la requte.

private final OkHttpClient client = new OkHttpClient();


public String get(String url) throws IOException {
// Prepare the request.
Request request = new Request.Builder().url(url).build();
// Execute the request.
Response response = client.newCall(request).execute();
// Get the result.
return response.body().string();
}
Code : Requte HTTP vers un serveur avec la bibliothque OkHttp.
Cest tout Exit la dizaine de ligne de code pour prparer la requte HTTP ou la manipulation
des InputStream pour rcuprer les rsultats. Toutes ces choses sont gres par la bibliothque.

23

4 Rcuprer les donnes distantes

Vous pouvez vous concentrer uniquement sur vos requtes HTTP. Malheureusement, toute la gestion des codes HTTP restent de votre ressort, mais lAPI est bien mieux pense pour la grer.
Pour toutes les informations propos de cette bibliothque, rendez-vous sur sa documentation
officielle et pour lutiliser, il suffit de renseigner la dpendance dans le fichier build.gradle de
votre projet.

compile 'com.squareup.okhttp3:okhttp:3.3.1'
Code : Dpendance Gradle pour OkHttp.
Gson peut tre utilis pour convertir des objets Java dans une reprsentation JSON ou inversement, dune chaine de caractres JSON vers des objets Java. Lide est de se passer dune API pour
placer manuellement les valeurs dun JSON vers des objets Java, laisser la bibliothque grer cette
tche.
Son usage est dconcertant de simplicit. Il vous suffit dinstancier un objet Gson et dutiliser
les mthodes toJson(...) pour passer dun objet une reprsentation JSON ou aux mthodes

fromJson(...) pour transformer un fichier JSON en des objets Java.


Par exemple, si le fichier JSON reprsente directement un objet, vous pouvez placer les valeurs
du fichier JSON dans un objet grce la ligne suivante :

Product p = new Gson().fromJson(json, Product.class);


Code : Traduit une reprsentation en chaine de caractres dun fichier JSON en un objet produit
avec Gson.
Dans notre tutoriel, nous avons un fichier JSON qui reprsente une liste de produits. Nous devons
informer Gson et lui fournir le type adquat de la manire suivante :

List<Product> list = new Gson().fromJson(json, new TypeToken<List<Product>>() {}.getTyp


Code : Traduit une reprsentation en chaine de caractres dun fichier JSON en une liste de produits avec Gson.
Grce au type gnrique spcifi dans TypeToken, Gson est au courant du type attendu et peut
convertir le fichier JSON dans une liste approprie.
[[attention]] | Tout ne fonctionne pas par magie non plus. Il existe une limitation Gson. Pour
que Gson puisse placer les valeurs dans un objet JSON, vous devez avoir des attributs dans votre
classe qui correspondent aux cls spcifies dans le fichier JSON. Dans le cas contraire, placez
lannotation @SerializedName sur lattribut qui ne possde pas le bon nom avec comme paramtre lannotation, la valeur de la cl dans le fichier JSON. Par exemple, pour un attribut qui se
nomme nom mais avec une cl name dans le fichier JSON, vous devez annoter lattribut de
la manire suivante : | java | @SerializedName("name") private String nom; |
Pour toutes les informations propos de cette bibliothque, rendez-vous sur sa documentation
officielle et pour lutiliser, il suffit de renseigner la dpendance dans le fichier build.gradle de
votre projet.

compile 'com.google.code.gson:gson:2.6.2'
Code : Dpendance Gradle pour Gson.

24

4.3 Facilitons-nous la vie avec des bibliothques

4.3.2 Retrofit
Vous tes dj impressionn par OkHttp et Gson ? Alors vous ne connaissez pas encore Retrofit.
Cette bibliothque permet de faire des requtes HTTP avec une plus grande simplicit que OkHttp,
soccupe tout seul de convertir vos JSON dans des objets Java et vous propose une architecture
adapte pour ragir en consquence aux codes HTTP. Par contre, elle est un poil plus complexe
utiliser. Il faudrait un tutoriel entier pour couvrir toutes les possibilits. Dans le cadre de ce
tutoriel ci-prsent, nous verrons que les strictes bases. En attendant un tutoriel franais sur le
sujet, rendez-vous sur la documentation officielle de la bibliothque.
Pour utiliser Retrofit, vous devez disposer dune instance de Retrofit (si possible unique dans
votre projet), dune ou plusieurs interfaces Java pour excuter des requtes vers votre serveur et
dune instance vers cette interface. Vous vous retrouvez avec le code suivante :
Une interface ProductService avec une seule mthode list() pour rcuprer la liste des
produits. Cette mthode est annote par @Get("list") pour informer Retrofit que la requte HTTP doit se faire en GET et que lURL se termine par list. La mthode doit retourner

Call<List<Product>>. Call est une interface de Retrofit qui permet dexcuter en synchrone
ou asynchrone la requte et le type gnrique lintrieur informe Retrofit du type de retour
souhait.

public interface ProductService {


@GET("list") Call<List<Product>> list();
}
Code : Interface Retrofit pour faire des requtes HTTP.
Maintenant que nous avons linterface, il suffit de lutiliser avec une instance. Pour rcuprer une
instance de cette interface, il faut passer par une instance de Retrofit. Cette instance sinitialise
grce un Builder. Dans ce builder, vous spcifiez lURL de base de votre serveur (dans notre
exemple http ://www.randoomz.org/).

Retrofit retrofit = new Retrofit.Builder()


.baseUrl("http://www.randoomz.org/")
.build();
Code : Construction dun objet Retrofit pour rcuprer des instances dun service et faire des requtes HTTP.
Linstance Retrofit disposition, vous pouvez construire une instance de votre service grce
la mthode create(Class< ?>). Cette instance nest pas rellement instancie par linterface
puisque le langage Java ne le permet pas. Nanmoins, vous navez pas vous soucier de limplmentation de linterface. Vous pouvez utiliser les mthodes dclares dans linterface et Retrofit
se chargera de faire vos requtes HTTP !

final ProductService service = retrofit.create(ProductService.class);


Code : Rcupration dune instance dun service pour faire des requtes HTTP.
Pour excuter une requte HTTP, vous avez 2 solutions :
Excuter la requte en synchrone service.list().execute(). Il en sera de votre responsabilit dexcuter la requte dans un thread secondaire.

25

4 Rcuprer les donnes distantes

Excuter la requte en asynchrone service.list().enqueue(Callback). Vous ntes


pas oblig de vous soucier dexcuter la requte dans un thread secondaire, Retrofit le fait
pour vous !
Ainsi, rcuprer la liste des produits en asynchrone se fera de la manire suivante :

service.list().enqueue(new Callback<List<Product>>() {
@Override public void onResponse(Call<List<Product>> call, Response<List<Product>> re
// Request ok. Get the result.
}
@Override public void onFailure(Call<List<Product>> call, Throwable t) {
// Request failed. Check why.
}
});
Code : Requte HTTP vers un serveur avec la bibliothque Retrofit.
Retrofit soccupe tout seul de faire la requte HTTP, il vous fournit automatiquement la conversion JSON vers vos classes Java. Concernant les cas derreur, vitez de vous faire avoir. Comme
vous le voyez dans lexemple, vous disposez de la mthode onFailure(Call, Throwable)
mais elle sera appele uniquement sil y a eu un problme avec la requte HTTP comme une perte
de la connexion internet. Si vous voulez grer les codes derreur HTTP, vous devez le faire dans la
mthode onResponse(Call, Response) grce la vrification response.isSuccessful()
sur la rponse de la requte. Si isSuccessful() renvoie faux, vous pouvez rcuprer le code
HTTP et son message derreur.
Comme dhabitude, ces explications ne sont que des introductions. Rendez-vous la documentation officielle pour connaitre toutes les possibilits de cette bibliothque. Quant la dpendance
Gradle, il suffit de spcifier cette ligne dans le bloc dependencies de votre fichier build.gradle.

compile 'com.squareup.retrofit2:retrofit:2.0.2'
Code : Dpendance Gradle pour Retrofit.

26

5 Conclusion
A la lecture de ce tutoriel, une architecture client/serveur devrait avoir moins de secret pour vous
et vous devriez tre capable deffectuer des requtes HTTP partir dune application Android.
Dailleurs, si vous voulez vous entrainer sur ce dernier point, sachez que Zeste de Savoir met
la disposition des dveloppeurs une API pour rcuprer des informations comme les membres et
vos conversations prives. Rien ne vous empche de dvelopper une application Android qui interroge cette API pour vous entrainer, voire mme pour proposer votre propre vue pour consulter
ces informations. Tout dpend de vous, de votre motivation et de votre imagination pour proposer
des alternatives !
Merci artragis, Arius et aux membres de la communaut de Zeste de Savoir pour leurs retours
sur ce tutoriel.
[[information]] | Ce tutoriel dans sa version crite ne vous suffit pas ? Sachez que des tutoriels vidos seront rajouts dans les semaines venir pour vous proposer une alternative pour apprendre
tous les concepts enseigns dans ce tutoriel ! Pour tre tenu au courant, il vous suffit de suivre ce
contenu grce au bouton Suivre ce contenu. Je me chargerais personnellement de poster un
message dans les commentaires pour vous notifier dune nouvelle vido qui sera intgre directement dans ce contenu. Vous aurez alors une notification dans votre centre de notifications sur
Zeste de Savoir !
Licne est le logo officiel du projet PHP For Android et disponible en libre tlchargement sur le
site du projet.

27

You might also like