ANDROID ET PHP/MYSQL
Andr0
16 juillet 2016
2.3 Fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
2.4.2 Applicatif
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
10
13
. . . . . . . . . . . . . . . . . . . . . . . .
13
Pr-requis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
14
3.1.1
. . . . . . . . . . . . . . . . . . . . . . . .
15
3.2.1 Dfinition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
. . . . . . . . . . . . . . . . . . . . . . . . . .
15
17
3.3.1
17
3.3.2 Solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
19
19
21
21
23
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 !
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.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.
10
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.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
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.
14
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.
15
Ainsi, toutes ses reprsentations se schmatisent de la manire suivante avec cette image issue
du site officiel 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.
16
[
{
"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
"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
19
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 :
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.
NObject.
20
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.
21
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.
22
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.
23
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
compile 'com.google.code.gson:gson:2.6.2'
Code : Dpendance Gradle pour Gson.
24
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.
25
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