SlideShare une entreprise Scribd logo
session fev 2016 Yann Caron (c) 2014 1
Programmation Android
09 – WebServices
Yann Caron
session fev 2016 Yann Caron (c) 2014 2
Sommaire - WebServices
 Généralités
 Interrogation
 Parcours (parsing)
 AsyncTask
 Mapping avancé : Jackson
 Coté serveurs
session fev 2016 Yann Caron (c) 2014 3
IN01 – Séance 09
Généralités
session fev 2016 Yann Caron (c) 2014 4
Généralités
 Assure la connexion et l'échange de données
entre applications hétérogènes distribuées,
généralement via le protocole HTTP
 Idée générale : utiliser une technologie
existante, facilement interopérable et ouverte
 Deux grands types de WebServices :
➔ WS-*
➔ REST
session fev 2016 Yann Caron (c) 2014 5
WS-* / REST
 WS-* ou RPC : Remote Procedure Call
➔ Paradigme d'appel de méthodes à distance (accès aux objets
via méthodes)
➔ Transfert de données via accesseurs (Getter / Setter)
➔ Bibliothèques serveur et cliente
 REST : Orienté données
➔ Transfert des objets via attributs
➔ Normalisation des URLs
➔ Côté client, sa simplicité permet l'utilisation ou non d'un client
session fev 2016 Yann Caron (c) 2014 6
WS-*
 Ensemble de standards
➔ SOAP (Simple Object Access Protocol) : échange de
messages
➔ WSDL (Web Service Description Language) :
description du message
➔ UDDI : L'annuaire
 Basé sur le modèle SOA (Service Oriented
Architecture)
session fev 2016 Yann Caron (c) 2014 7
REST
 Representational State Transfer
 Formalisé par Roy Fielding en 2000 (lors de sa thèse de
doctorat)
 Plutôt un style architectural qui respecte des règles
➔ Client - Serveur
➔ State less (n'entretient pas d'état client côté serveur)
➔ Mise en cache
➔ Interface uniforme (Une URI pour une ressource)
➔ Architecture en couches
➔ Code-on-demand (optionnel)
session fev 2016 Yann Caron (c) 2014 8
Architecture REST
HTTP / URI
XML / JSon
session fev 2016 Yann Caron (c) 2014 9
XML
 Extensible Markup Language
 Langage à balises encadrés par des chevrons
<menu id="file" value="File">
<popup>
<menuitem value="New" onclick="CreateNewDoc()" />
<menuitem value="Open" onclick="OpenDoc()" />
<menuitem value="Close" onclick="CloseDoc()" />
</popup>
</menu>
session fev 2016 Yann Caron (c) 2014 10
JSon
 JavaScript Object Notation
 Sous-ensemble grammatical issu de JavaScript
{
"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{ "value": "New", "onclick": "CreateNewDoc()" },
{ "value": "Open", "onclick": "OpenDoc()" },
{ "value": "Close", "onclick": "CloseDoc()" }
]
}
}
}
session fev 2016 Yann Caron (c) 2014 11
JSON vs XML
 Pour JSON :
➔ Moins verbeux, donc moins couteux en ressources
➔ Facile à apprendre
➔ Typage simple et connu
➔ Plus facile à parser
 Pour XML :
➔ Plus flexible (Syntax JSON rigide)
➔ Commentaires
➔ Validation (XML Schema, DTD)
session fev 2016 Yann Caron (c) 2014 12
Avantages / inconvénients
 Avantages :
➔ Interopérabilité et portabilité
➔ Technologie ouverte et connue
➔ Formats textes (XML / JSon) humainement lisibles
➔ Facilement transportable (port 80)
 Inconvénients
➔ Format volumineux et peu performant (cas du XML)
session fev 2016 Yann Caron (c) 2014 13
IN01 – Séance 09
Interrogation
session fev 2016 Yann Caron (c) 2014 14
Introduction
 Choix de l'architecture :: REST
 Choix du langage :: JSON
 Pourquoi ?
➔ Natif, rien à installer
➔ WebServices RPC nécessiterait des librairies,
comme Ksoap2-android
➔ RPC complexe à mettre en oeuvre
session fev 2016 Yann Caron (c) 2014 15
Android
 Utilisation des objets URL et
HttpURLConnection
URL url = new URL("http://My URL");
HttpURLConnection urlConnection = (HttpURLConnection)
url.openConnection();
InputStream in = new
BufferedInputStream(urlConnection.getInputStream());
session fev 2016 Yann Caron (c) 2014 16
Lire le Stream
 Stream String→
BufferedReader reader = new BufferedReader(new
InputStreamReader(in));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "n");
}
Decorator
session fev 2016 Yann Caron (c) 2014 17
FileInputStream et FileOutputStream
 Héritent des classes abstraites InputStream et
OutputStream du package java.io
Lecture Ecriture
session fev 2016 Yann Caron (c) 2014 18
Java.io
 Les classes InputStream gèrent la lecture
 Les classes OutputStream gèrent l'écriture
 Il faudra gérer les exceptions (IOException)
session fev 2016 Yann Caron (c) 2014 19
Java.io
 Ajoute des fonctionnalités grâce au pattern Decorator
 FileInputStream : données brutes
 DataInputStream : données typées
 BufferedInputStream : ajoute un tampon (une ligne,
le fichier etc...)
 PushbackInputStream : permet de remettre des
données déjà lues dans le flux entrant
 LineNumberInputStream : indique le numéro de la
ligne lue
session fev 2016 Yann Caron (c) 2014 20
Decorator
 On peut les cumuler (système de filtrage
paramétrable)
BufferedInputStream bis = new BufferredInputStream(
new DataInputStream(
new FileInputStream(
new File("toto.txt"))));
session fev 2016 Yann Caron (c) 2014 21
IN01 – Séance 09
Parcours (parsing)
session fev 2016 Yann Caron (c) 2014 22
Parcours (parsing)
 Le SDK Android fournit une bibliothèque de parsing
JSON simple d'utilisation : org.json.JSONObject
 Et les méthode de parcours du DOM :
➔ getJSONObject (name) : lit un objet imbriqué
➔ getJSONArray (name) : lit une collection
➔ getBool (name), getDouble (name), getInt
(name), getString (name), lisent des valeurs scalaires
➔ put(name, value) ajoute une paire clé / valeur dans la
structure JSON
session fev 2016 Yann Caron (c) 2014 23
REST WebService JSON
 http://api.geonames.org/findNearestIntersectio
nJSON?lat=37.451&lng=-
122.18&username=demo
{
"credits":"1.0",
"intersection":
{
"lng":"-122.180842",
"lat":"37.450649",
"street1":"Roble Ave",
"street2":"Curtis St"
}
}
session fev 2016 Yann Caron (c) 2014 24
DOM & JSONObject
JSONObject jsonObject = new JSONObject(data);
double credits = jsonObject.getDouble("credits");
JSONObject intersection =
jsonObject.getJSONObject("intersection");
double lng = intersection.getDouble("lng");
double lat = intersection.getDouble("lat");
String street1 = intersection.getDouble("street1");
String street2 = intersection.getDouble("street2");
session fev 2016 Yann Caron (c) 2014 25
Data model
 Le paradigme objet, par essence, tente de
représenter toute entité sous forme d'un objet
 Les données de l'application seront regroupées
dans un module appelé data model
 Better, faster lighter Java (Bruce Tate et Justin
Gehtland)
session fev 2016 Yann Caron (c) 2014 26
Data model
class Intersection {
final double lng, lat;
final String street1, street2;
// constructor
public Intersection(double lng, double lat, String
street1, String street2) { … }
// getters
public double getLng() { return lng; }
public double getLat() { return lat; }
public String getStreet1() { return street1; }
public String getStreet2() { return street2; }
}
Final / immutabilité
session fev 2016 Yann Caron (c) 2014 27
Data model
 Bonne pratique : immutabilité, évite les effets
de bord
 Mapping (“maison”) JSON / Object
 Problématique récurrente et fastidieuse
Intersection dataIntersection = new Intersection(lng,
lat, street1, street2);
session fev 2016 Yann Caron (c) 2014 28
XML ?
 L'ADK fournis des bibliothèques de parcours JSON
et XML
 Pour XML on peut utiliser 3 types de “parseurs” :
➔ DOM : Document Object Model, orienté objet
➔ SAX : Simple API for XML, mécanisme à base de
callback (startDocument, startElement,
endElement, endDocument)
➔ XmlPullParser : approche impérative (while / if,
elseif), recommandé par Google
session fev 2016 Yann Caron (c) 2014 29
IN01 – Séance 09
Asynctask
session fev 2016 Yann Caron (c) 2014 30
AsyncTask
 L'appel d'une ressource distante peut avoir un
coût (temps)
 Bloque l'interface utilisateur
 L'ADK offre un outil pour gérer les tâches
couteuses : la classe abstraite AsyncTask
session fev 2016 Yann Caron (c) 2014 31
Principe
 Créer une classe concrète qui hérite d'AsyncTask
 Une classe (interne), locale et anonyme
 Surcharger les méthodes :
➔ onPreExecute : exécuté avant l'exécution
➔ doInBackground : l'appel à la ressource bloquante
➔ onPostExecute : s'exécute après l'opération
 Peut aussi gérer l'annulation de l'utilisateur ou la
progression
session fev 2016 Yann Caron (c) 2014 32
Code
// Classe locale et anonyme
new AsyncTask<Location, Void, String>() {
ProgressDialog dialog;
@Override
protected void onPreExecute() {
// UI thread
dialog = ProgressDialog.show(MainActivity.this,
"[titre]", "[message]", true, true);
}
@Override
protected String doInBackground(Location... params) {
// Autre thread
return null;
}
@Override
protected void onPostExecute(String res) {
// UI thread
dialog.dismiss();
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, currentLocation);
<Paramètre, Progression, Résultat>
Ressource coûteuse
Gestion de la boite de dialogue
session fev 2016 Yann Caron (c) 2014 33
IN01 – Séance 09
Mapping avancé : Jackson
session fev 2016 Yann Caron (c) 2014 34
Jackson
 Jackson est une bibliothèque de serialization /
Deserialisation au format JSON
 Une extension permet de faire du XML
 Utilise des POJOs (Plain Old Java Object); des
objets Java sans artifice
 “Under the hood”, utilise l'introspection de Java
 Configuration du matching par annotation
session fev 2016 Yann Caron (c) 2014 35
Project setting : Gradle
session fev 2016 Yann Caron (c) 2014 36
Rappel : le fichier JSON
{
"credits":"1.0",
"intersection":
{
"lng":"-122.180842",
"lat":"37.450649",
"street1":"Roble Ave",
"street2":"Curtis St"
}
}
Objet imbriqué
session fev 2016 Yann Caron (c) 2014 37
Les Pojos correspondants
public class IntersectionContainer {
@JsonProperty("credits")
public double version;
public Intersection intersection;
}
public class Intersection {
public double lng, lat;
public String street1, street2;
}
Ou des accesseurs
Annotation
Attention ! Ce ne sont pas des BEANS
session fev 2016 Yann Caron (c) 2014 38
Le parsing
 Extrêmement simple !
 Déduit le nom ou se sert des annotations:
➔ @JsonProperty (name) : specifie le nom Json
➔ @JsonIgnore () : ignore l'attribut
ObjectMapper mapper = new ObjectMapper();
IntersectionContainer ic = mapper.readValue(JSON_DATA,
IntersectionContainer.class);
session fev 2016 Yann Caron (c) 2014 39
Annotation : intrusif
 Dans le cas ou l'objet à “mapper” existe déjà
dans une autre librairie
 Solution : Utilisation des Mix-In annotations
 Une interface qui contient les attributs et qui
leur associe les annotations nécessaires
session fev 2016 Yann Caron (c) 2014 40
Mix-In
abstract class MixIn {
@JsonProperty("credits") double version;
}
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.addMixInAnnotations(
IntersectionContainer.class, MixIn.class);
IntersectionContainer ic = mapper.readValue(
JSON_DATA, IntersectionContainer.class);
}
Association
Specification
session fev 2016 Yann Caron (c) 2014 41
Conclusion sur Jackson
 Ce n'est pas l'unique bibliothèque de “mapping”
XML (XStream)
 Avantage : gère à la fois JSon et XML
 Performances Android
 Le mapping objet devient de plus en plus
présent dans les applications. Standard de
facto.
session fev 2016 Yann Caron (c) 2014 42
IN01 – Séance 09
Coté serveurs
session fev 2016 Yann Caron (c) 2014 43
Sur internet : Geonames
 Base de données géographique
 Service Météo METAR
 Offre une interface complète de WebServices REST
au format XML / JSON, mais aussi, CSV, RSS, KML
 Exemples : Trouver l'intersection routière la plus
proche (US) d'une position. Donner les données
météo METAR de l'aéroport le plus proche de la
position etc....
session fev 2016 Yann Caron (c) 2014 44
Serveur local : RESTFull
 Serveur REST en java (JAX-RS / GlassFish /JEE)
 But : Synchroniser les données de l'appareil sur
un serveur mutualisé
 Principe, réaliser un “mapping” des tables de la
base de données
 http://mbaron.developpez.com/tutoriels/soa/d
eveloppement-services-web-rest-jaxrs-
netbeans/
session fev 2016 Yann Caron (c) 2014 45
Architecture
EDBMS / Rest client
DBMS / Rest Server
session fev 2016 Yann Caron (c) 2014 46
Fin
 Merci de votre attention
 Des questions ?

Contenu connexe

Tendances

In01 - Programmation Android - Travaux pratiques
In01 - Programmation Android - Travaux pratiquesIn01 - Programmation Android - Travaux pratiques
In01 - Programmation Android - Travaux pratiques
Yann Caron
 
In01 - Programmation Android - 07 - techniques avancées
In01 - Programmation Android - 07 - techniques avancéesIn01 - Programmation Android - 07 - techniques avancées
In01 - Programmation Android - 07 - techniques avancées
Yann Caron
 
In01 - Programmation Android - 05 - Google map
In01 - Programmation Android - 05 - Google mapIn01 - Programmation Android - 05 - Google map
In01 - Programmation Android - 05 - Google map
Yann Caron
 
In01 - Programmation Android - 04 - databases
In01 - Programmation Android - 04 - databasesIn01 - Programmation Android - 04 - databases
In01 - Programmation Android - 04 - databases
Yann Caron
 
Programmation Android - 03 - IHM bases
Programmation Android - 03 - IHM basesProgrammation Android - 03 - IHM bases
Programmation Android - 03 - IHM bases
Yann Caron
 
Programmation Android - 05 - Google map
Programmation Android - 05 - Google mapProgrammation Android - 05 - Google map
Programmation Android - 05 - Google map
Yann Caron
 
In01 - Programmation Android - 03 - HMI
In01 - Programmation Android - 03 - HMIIn01 - Programmation Android - 03 - HMI
In01 - Programmation Android - 03 - HMI
Yann Caron
 
In01 - Programmation Android - 02 - android
In01 - Programmation Android - 02 - androidIn01 - Programmation Android - 02 - android
In01 - Programmation Android - 02 - android
Yann Caron
 
In01 - Programmation Android - 06 - publication
In01 - Programmation Android - 06 - publicationIn01 - Programmation Android - 06 - publication
In01 - Programmation Android - 06 - publication
Yann Caron
 
Programmation Android - 08 - Android debug bridge
Programmation Android - 08 - Android debug bridgeProgrammation Android - 08 - Android debug bridge
Programmation Android - 08 - Android debug bridge
Yann Caron
 
Cours de C++, en français, 2002 - Cours 3.5
Cours de C++, en français, 2002 - Cours 3.5Cours de C++, en français, 2002 - Cours 3.5
Cours de C++, en français, 2002 - Cours 3.5
Laurent BUNIET
 
Cours BD M1
Cours BD M1Cours BD M1
Cours BD M1
Pierre Colomb
 
R Devtools
R DevtoolsR Devtools
R Devtools
Cdiscount
 
PostGIS @ Pgday.eu 2009
PostGIS @ Pgday.eu 2009PostGIS @ Pgday.eu 2009
PostGIS @ Pgday.eu 2009
Oslandia
 
Applications Android - cours 5 : Classe Object et Collections en Java
Applications Android - cours 5 : Classe Object et Collections en JavaApplications Android - cours 5 : Classe Object et Collections en Java
Applications Android - cours 5 : Classe Object et Collections en Java
Ahmed-Chawki Chaouche
 

Tendances (15)

In01 - Programmation Android - Travaux pratiques
In01 - Programmation Android - Travaux pratiquesIn01 - Programmation Android - Travaux pratiques
In01 - Programmation Android - Travaux pratiques
 
In01 - Programmation Android - 07 - techniques avancées
In01 - Programmation Android - 07 - techniques avancéesIn01 - Programmation Android - 07 - techniques avancées
In01 - Programmation Android - 07 - techniques avancées
 
In01 - Programmation Android - 05 - Google map
In01 - Programmation Android - 05 - Google mapIn01 - Programmation Android - 05 - Google map
In01 - Programmation Android - 05 - Google map
 
In01 - Programmation Android - 04 - databases
In01 - Programmation Android - 04 - databasesIn01 - Programmation Android - 04 - databases
In01 - Programmation Android - 04 - databases
 
Programmation Android - 03 - IHM bases
Programmation Android - 03 - IHM basesProgrammation Android - 03 - IHM bases
Programmation Android - 03 - IHM bases
 
Programmation Android - 05 - Google map
Programmation Android - 05 - Google mapProgrammation Android - 05 - Google map
Programmation Android - 05 - Google map
 
In01 - Programmation Android - 03 - HMI
In01 - Programmation Android - 03 - HMIIn01 - Programmation Android - 03 - HMI
In01 - Programmation Android - 03 - HMI
 
In01 - Programmation Android - 02 - android
In01 - Programmation Android - 02 - androidIn01 - Programmation Android - 02 - android
In01 - Programmation Android - 02 - android
 
In01 - Programmation Android - 06 - publication
In01 - Programmation Android - 06 - publicationIn01 - Programmation Android - 06 - publication
In01 - Programmation Android - 06 - publication
 
Programmation Android - 08 - Android debug bridge
Programmation Android - 08 - Android debug bridgeProgrammation Android - 08 - Android debug bridge
Programmation Android - 08 - Android debug bridge
 
Cours de C++, en français, 2002 - Cours 3.5
Cours de C++, en français, 2002 - Cours 3.5Cours de C++, en français, 2002 - Cours 3.5
Cours de C++, en français, 2002 - Cours 3.5
 
Cours BD M1
Cours BD M1Cours BD M1
Cours BD M1
 
R Devtools
R DevtoolsR Devtools
R Devtools
 
PostGIS @ Pgday.eu 2009
PostGIS @ Pgday.eu 2009PostGIS @ Pgday.eu 2009
PostGIS @ Pgday.eu 2009
 
Applications Android - cours 5 : Classe Object et Collections en Java
Applications Android - cours 5 : Classe Object et Collections en JavaApplications Android - cours 5 : Classe Object et Collections en Java
Applications Android - cours 5 : Classe Object et Collections en Java
 

Similaire à Programmation Android - 09 - Web services

HTML5 en projet
HTML5 en projetHTML5 en projet
HTML5 en projet
Normandy JUG
 
De java à swift en 2 temps trois mouvements
De java à swift en 2 temps trois mouvementsDe java à swift en 2 temps trois mouvements
De java à swift en 2 temps trois mouvements
Didier Plaindoux
 
Présentation nouveauté java7
Présentation nouveauté java7Présentation nouveauté java7
Présentation nouveauté java7
Cynapsys It Hotspot
 
Java version 11 - les 9 nouveautes
Java version 11 -  les 9 nouveautesJava version 11 -  les 9 nouveautes
Java version 11 - les 9 nouveautes
Abdenour Bouateli
 
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -introNosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -introOlivier Mallassi
 
PréSentation Qualoo Le Generateur De Code Java J2 Ee
PréSentation Qualoo   Le Generateur De Code Java J2 EePréSentation Qualoo   Le Generateur De Code Java J2 Ee
PréSentation Qualoo Le Generateur De Code Java J2 EeST informatique services
 
Gestion de formulaires en PHP
Gestion de formulaires en PHPGestion de formulaires en PHP
Gestion de formulaires en PHP
Jean-Marie Renouard
 
Tester unitairement une application java
Tester unitairement une application javaTester unitairement une application java
Tester unitairement une application java
Antoine Rey
 
Javascript et JQuery
Javascript et JQueryJavascript et JQuery
Javascript et JQuery
Jean-Marie Renouard
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications JavaAntoine Rey
 
"Input/Ouput, 16 ans après" à Devoxx France 2012
"Input/Ouput, 16 ans après" à Devoxx France 2012"Input/Ouput, 16 ans après" à Devoxx France 2012
"Input/Ouput, 16 ans après" à Devoxx France 2012
Jean-Michel Doudoux
 
Visual Studio 2008 Overview
Visual Studio 2008 OverviewVisual Studio 2008 Overview
Visual Studio 2008 OverviewGregory Renard
 
ACRA - Présentation PAUG Avril 2011
ACRA - Présentation PAUG Avril 2011ACRA - Présentation PAUG Avril 2011
ACRA - Présentation PAUG Avril 2011
Kevin Gaudin
 
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Normandy JUG
 
Rich Desktop Applications
Rich Desktop ApplicationsRich Desktop Applications
Rich Desktop Applicationsgoldoraf
 
Activity
ActivityActivity
Activitydido
 
Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017
Jean-Michel Doudoux
 

Similaire à Programmation Android - 09 - Web services (20)

HTML5 en projet
HTML5 en projetHTML5 en projet
HTML5 en projet
 
De java à swift en 2 temps trois mouvements
De java à swift en 2 temps trois mouvementsDe java à swift en 2 temps trois mouvements
De java à swift en 2 temps trois mouvements
 
Présentation nouveauté java7
Présentation nouveauté java7Présentation nouveauté java7
Présentation nouveauté java7
 
Java version 11 - les 9 nouveautes
Java version 11 -  les 9 nouveautesJava version 11 -  les 9 nouveautes
Java version 11 - les 9 nouveautes
 
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -introNosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
 
PréSentation Qualoo Le Generateur De Code Java J2 Ee
PréSentation Qualoo   Le Generateur De Code Java J2 EePréSentation Qualoo   Le Generateur De Code Java J2 Ee
PréSentation Qualoo Le Generateur De Code Java J2 Ee
 
Gestion de formulaires en PHP
Gestion de formulaires en PHPGestion de formulaires en PHP
Gestion de formulaires en PHP
 
NIO 2
NIO 2NIO 2
NIO 2
 
Tester unitairement une application java
Tester unitairement une application javaTester unitairement une application java
Tester unitairement une application java
 
Javascript et JQuery
Javascript et JQueryJavascript et JQuery
Javascript et JQuery
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications Java
 
mix-it 2011
mix-it 2011mix-it 2011
mix-it 2011
 
"Input/Ouput, 16 ans après" à Devoxx France 2012
"Input/Ouput, 16 ans après" à Devoxx France 2012"Input/Ouput, 16 ans après" à Devoxx France 2012
"Input/Ouput, 16 ans après" à Devoxx France 2012
 
Visual Studio 2008 Overview
Visual Studio 2008 OverviewVisual Studio 2008 Overview
Visual Studio 2008 Overview
 
ACRA - Présentation PAUG Avril 2011
ACRA - Présentation PAUG Avril 2011ACRA - Présentation PAUG Avril 2011
ACRA - Présentation PAUG Avril 2011
 
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
 
iTunes Stats
iTunes StatsiTunes Stats
iTunes Stats
 
Rich Desktop Applications
Rich Desktop ApplicationsRich Desktop Applications
Rich Desktop Applications
 
Activity
ActivityActivity
Activity
 
Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017
 

Plus de Yann Caron

Théorie des langages - TP - WellKnownText
Théorie des langages - TP  - WellKnownTextThéorie des langages - TP  - WellKnownText
Théorie des langages - TP - WellKnownText
Yann Caron
 
Théorie des langages - 04 Théorie des langages
Théorie des langages - 04 Théorie des langagesThéorie des langages - 04 Théorie des langages
Théorie des langages - 04 Théorie des langages
Yann Caron
 
Théorie des langages - 03 - Principes et paradigmes
Théorie des langages - 03 - Principes et paradigmesThéorie des langages - 03 - Principes et paradigmes
Théorie des langages - 03 - Principes et paradigmes
Yann Caron
 
Théorie des langages - 02 - Code gen
Théorie des langages - 02 - Code genThéorie des langages - 02 - Code gen
Théorie des langages - 02 - Code gen
Yann Caron
 
Théorie des langages - 01.1 - Parcours d'arbres
Théorie des langages - 01.1 - Parcours d'arbresThéorie des langages - 01.1 - Parcours d'arbres
Théorie des langages - 01.1 - Parcours d'arbres
Yann Caron
 
Théorie des langages - 01 - Compilation
Théorie des langages - 01 - CompilationThéorie des langages - 01 - Compilation
Théorie des langages - 01 - Compilation
Yann Caron
 
Théorie des langages - 00 - Introduction
Théorie des langages - 00 - IntroductionThéorie des langages - 00 - Introduction
Théorie des langages - 00 - Introduction
Yann Caron
 
Algea - 04 - conclusion
Algea - 04 - conclusionAlgea - 04 - conclusion
Algea - 04 - conclusion
Yann Caron
 
Algea - 03 - ennemis
Algea - 03 - ennemisAlgea - 03 - ennemis
Algea - 03 - ennemis
Yann Caron
 
Algea - 02 - gemmes
Algea - 02 - gemmesAlgea - 02 - gemmes
Algea - 02 - gemmes
Yann Caron
 
Algea - 01 - hero
Algea - 01 - heroAlgea - 01 - hero
Algea - 01 - hero
Yann Caron
 
ALGEA - 00 - introduction
ALGEA - 00 - introductionALGEA - 00 - introduction
ALGEA - 00 - introduction
Yann Caron
 
Cours CNAM In01 - Programmation Android - Septembre 2014
Cours CNAM In01 - Programmation Android - Septembre 2014Cours CNAM In01 - Programmation Android - Septembre 2014
Cours CNAM In01 - Programmation Android - Septembre 2014
Yann Caron
 

Plus de Yann Caron (13)

Théorie des langages - TP - WellKnownText
Théorie des langages - TP  - WellKnownTextThéorie des langages - TP  - WellKnownText
Théorie des langages - TP - WellKnownText
 
Théorie des langages - 04 Théorie des langages
Théorie des langages - 04 Théorie des langagesThéorie des langages - 04 Théorie des langages
Théorie des langages - 04 Théorie des langages
 
Théorie des langages - 03 - Principes et paradigmes
Théorie des langages - 03 - Principes et paradigmesThéorie des langages - 03 - Principes et paradigmes
Théorie des langages - 03 - Principes et paradigmes
 
Théorie des langages - 02 - Code gen
Théorie des langages - 02 - Code genThéorie des langages - 02 - Code gen
Théorie des langages - 02 - Code gen
 
Théorie des langages - 01.1 - Parcours d'arbres
Théorie des langages - 01.1 - Parcours d'arbresThéorie des langages - 01.1 - Parcours d'arbres
Théorie des langages - 01.1 - Parcours d'arbres
 
Théorie des langages - 01 - Compilation
Théorie des langages - 01 - CompilationThéorie des langages - 01 - Compilation
Théorie des langages - 01 - Compilation
 
Théorie des langages - 00 - Introduction
Théorie des langages - 00 - IntroductionThéorie des langages - 00 - Introduction
Théorie des langages - 00 - Introduction
 
Algea - 04 - conclusion
Algea - 04 - conclusionAlgea - 04 - conclusion
Algea - 04 - conclusion
 
Algea - 03 - ennemis
Algea - 03 - ennemisAlgea - 03 - ennemis
Algea - 03 - ennemis
 
Algea - 02 - gemmes
Algea - 02 - gemmesAlgea - 02 - gemmes
Algea - 02 - gemmes
 
Algea - 01 - hero
Algea - 01 - heroAlgea - 01 - hero
Algea - 01 - hero
 
ALGEA - 00 - introduction
ALGEA - 00 - introductionALGEA - 00 - introduction
ALGEA - 00 - introduction
 
Cours CNAM In01 - Programmation Android - Septembre 2014
Cours CNAM In01 - Programmation Android - Septembre 2014Cours CNAM In01 - Programmation Android - Septembre 2014
Cours CNAM In01 - Programmation Android - Septembre 2014
 

Dernier

Les écrans informatiques au fil du temps.pptx
Les écrans informatiques au fil du temps.pptxLes écrans informatiques au fil du temps.pptx
Les écrans informatiques au fil du temps.pptx
abderrahimbourimi
 
De l'IA comme plagiat à la rédaction d'une « charte IA » à l'université
De l'IA comme plagiat à la rédaction d'une « charte IA » à l'universitéDe l'IA comme plagiat à la rédaction d'une « charte IA » à l'université
De l'IA comme plagiat à la rédaction d'une « charte IA » à l'université
Université de Franche-Comté
 
Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)
Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)
Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)
Laurent Speyser
 
PRESENTATION DE L'ACTIVE DIRECTORY SOUS WINDOWS SERVEUR.pptx
PRESENTATION DE L'ACTIVE DIRECTORY SOUS WINDOWS SERVEUR.pptxPRESENTATION DE L'ACTIVE DIRECTORY SOUS WINDOWS SERVEUR.pptx
PRESENTATION DE L'ACTIVE DIRECTORY SOUS WINDOWS SERVEUR.pptx
AlbertSmithTambwe
 
Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...
Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...
Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...
OCTO Technology
 
Le support de présentation des Signaux 2024
Le support de présentation des Signaux 2024Le support de présentation des Signaux 2024
Le support de présentation des Signaux 2024
UNITECBordeaux
 
MongoDB in a scale-up: how to get away from a monolithic hell — MongoDB Paris...
MongoDB in a scale-up: how to get away from a monolithic hell — MongoDB Paris...MongoDB in a scale-up: how to get away from a monolithic hell — MongoDB Paris...
MongoDB in a scale-up: how to get away from a monolithic hell — MongoDB Paris...
Horgix
 

Dernier (7)

Les écrans informatiques au fil du temps.pptx
Les écrans informatiques au fil du temps.pptxLes écrans informatiques au fil du temps.pptx
Les écrans informatiques au fil du temps.pptx
 
De l'IA comme plagiat à la rédaction d'une « charte IA » à l'université
De l'IA comme plagiat à la rédaction d'une « charte IA » à l'universitéDe l'IA comme plagiat à la rédaction d'une « charte IA » à l'université
De l'IA comme plagiat à la rédaction d'une « charte IA » à l'université
 
Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)
Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)
Ouvrez la porte ou prenez un mur (Agile Tour Genève 2024)
 
PRESENTATION DE L'ACTIVE DIRECTORY SOUS WINDOWS SERVEUR.pptx
PRESENTATION DE L'ACTIVE DIRECTORY SOUS WINDOWS SERVEUR.pptxPRESENTATION DE L'ACTIVE DIRECTORY SOUS WINDOWS SERVEUR.pptx
PRESENTATION DE L'ACTIVE DIRECTORY SOUS WINDOWS SERVEUR.pptx
 
Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...
Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...
Le Comptoir OCTO - Qu’apporte l’analyse de cycle de vie lors d’un audit d’éco...
 
Le support de présentation des Signaux 2024
Le support de présentation des Signaux 2024Le support de présentation des Signaux 2024
Le support de présentation des Signaux 2024
 
MongoDB in a scale-up: how to get away from a monolithic hell — MongoDB Paris...
MongoDB in a scale-up: how to get away from a monolithic hell — MongoDB Paris...MongoDB in a scale-up: how to get away from a monolithic hell — MongoDB Paris...
MongoDB in a scale-up: how to get away from a monolithic hell — MongoDB Paris...
 

Programmation Android - 09 - Web services

  • 1. session fev 2016 Yann Caron (c) 2014 1 Programmation Android 09 – WebServices Yann Caron
  • 2. session fev 2016 Yann Caron (c) 2014 2 Sommaire - WebServices  Généralités  Interrogation  Parcours (parsing)  AsyncTask  Mapping avancé : Jackson  Coté serveurs
  • 3. session fev 2016 Yann Caron (c) 2014 3 IN01 – Séance 09 Généralités
  • 4. session fev 2016 Yann Caron (c) 2014 4 Généralités  Assure la connexion et l'échange de données entre applications hétérogènes distribuées, généralement via le protocole HTTP  Idée générale : utiliser une technologie existante, facilement interopérable et ouverte  Deux grands types de WebServices : ➔ WS-* ➔ REST
  • 5. session fev 2016 Yann Caron (c) 2014 5 WS-* / REST  WS-* ou RPC : Remote Procedure Call ➔ Paradigme d'appel de méthodes à distance (accès aux objets via méthodes) ➔ Transfert de données via accesseurs (Getter / Setter) ➔ Bibliothèques serveur et cliente  REST : Orienté données ➔ Transfert des objets via attributs ➔ Normalisation des URLs ➔ Côté client, sa simplicité permet l'utilisation ou non d'un client
  • 6. session fev 2016 Yann Caron (c) 2014 6 WS-*  Ensemble de standards ➔ SOAP (Simple Object Access Protocol) : échange de messages ➔ WSDL (Web Service Description Language) : description du message ➔ UDDI : L'annuaire  Basé sur le modèle SOA (Service Oriented Architecture)
  • 7. session fev 2016 Yann Caron (c) 2014 7 REST  Representational State Transfer  Formalisé par Roy Fielding en 2000 (lors de sa thèse de doctorat)  Plutôt un style architectural qui respecte des règles ➔ Client - Serveur ➔ State less (n'entretient pas d'état client côté serveur) ➔ Mise en cache ➔ Interface uniforme (Une URI pour une ressource) ➔ Architecture en couches ➔ Code-on-demand (optionnel)
  • 8. session fev 2016 Yann Caron (c) 2014 8 Architecture REST HTTP / URI XML / JSon
  • 9. session fev 2016 Yann Caron (c) 2014 9 XML  Extensible Markup Language  Langage à balises encadrés par des chevrons <menu id="file" value="File"> <popup> <menuitem value="New" onclick="CreateNewDoc()" /> <menuitem value="Open" onclick="OpenDoc()" /> <menuitem value="Close" onclick="CloseDoc()" /> </popup> </menu>
  • 10. session fev 2016 Yann Caron (c) 2014 10 JSon  JavaScript Object Notation  Sous-ensemble grammatical issu de JavaScript { "menu": { "id": "file", "value": "File", "popup": { "menuitem": [ { "value": "New", "onclick": "CreateNewDoc()" }, { "value": "Open", "onclick": "OpenDoc()" }, { "value": "Close", "onclick": "CloseDoc()" } ] } } }
  • 11. session fev 2016 Yann Caron (c) 2014 11 JSON vs XML  Pour JSON : ➔ Moins verbeux, donc moins couteux en ressources ➔ Facile à apprendre ➔ Typage simple et connu ➔ Plus facile à parser  Pour XML : ➔ Plus flexible (Syntax JSON rigide) ➔ Commentaires ➔ Validation (XML Schema, DTD)
  • 12. session fev 2016 Yann Caron (c) 2014 12 Avantages / inconvénients  Avantages : ➔ Interopérabilité et portabilité ➔ Technologie ouverte et connue ➔ Formats textes (XML / JSon) humainement lisibles ➔ Facilement transportable (port 80)  Inconvénients ➔ Format volumineux et peu performant (cas du XML)
  • 13. session fev 2016 Yann Caron (c) 2014 13 IN01 – Séance 09 Interrogation
  • 14. session fev 2016 Yann Caron (c) 2014 14 Introduction  Choix de l'architecture :: REST  Choix du langage :: JSON  Pourquoi ? ➔ Natif, rien à installer ➔ WebServices RPC nécessiterait des librairies, comme Ksoap2-android ➔ RPC complexe à mettre en oeuvre
  • 15. session fev 2016 Yann Caron (c) 2014 15 Android  Utilisation des objets URL et HttpURLConnection URL url = new URL("http://My URL"); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); InputStream in = new BufferedInputStream(urlConnection.getInputStream());
  • 16. session fev 2016 Yann Caron (c) 2014 16 Lire le Stream  Stream String→ BufferedReader reader = new BufferedReader(new InputStreamReader(in)); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "n"); } Decorator
  • 17. session fev 2016 Yann Caron (c) 2014 17 FileInputStream et FileOutputStream  Héritent des classes abstraites InputStream et OutputStream du package java.io Lecture Ecriture
  • 18. session fev 2016 Yann Caron (c) 2014 18 Java.io  Les classes InputStream gèrent la lecture  Les classes OutputStream gèrent l'écriture  Il faudra gérer les exceptions (IOException)
  • 19. session fev 2016 Yann Caron (c) 2014 19 Java.io  Ajoute des fonctionnalités grâce au pattern Decorator  FileInputStream : données brutes  DataInputStream : données typées  BufferedInputStream : ajoute un tampon (une ligne, le fichier etc...)  PushbackInputStream : permet de remettre des données déjà lues dans le flux entrant  LineNumberInputStream : indique le numéro de la ligne lue
  • 20. session fev 2016 Yann Caron (c) 2014 20 Decorator  On peut les cumuler (système de filtrage paramétrable) BufferedInputStream bis = new BufferredInputStream( new DataInputStream( new FileInputStream( new File("toto.txt"))));
  • 21. session fev 2016 Yann Caron (c) 2014 21 IN01 – Séance 09 Parcours (parsing)
  • 22. session fev 2016 Yann Caron (c) 2014 22 Parcours (parsing)  Le SDK Android fournit une bibliothèque de parsing JSON simple d'utilisation : org.json.JSONObject  Et les méthode de parcours du DOM : ➔ getJSONObject (name) : lit un objet imbriqué ➔ getJSONArray (name) : lit une collection ➔ getBool (name), getDouble (name), getInt (name), getString (name), lisent des valeurs scalaires ➔ put(name, value) ajoute une paire clé / valeur dans la structure JSON
  • 23. session fev 2016 Yann Caron (c) 2014 23 REST WebService JSON  http://api.geonames.org/findNearestIntersectio nJSON?lat=37.451&lng=- 122.18&username=demo { "credits":"1.0", "intersection": { "lng":"-122.180842", "lat":"37.450649", "street1":"Roble Ave", "street2":"Curtis St" } }
  • 24. session fev 2016 Yann Caron (c) 2014 24 DOM & JSONObject JSONObject jsonObject = new JSONObject(data); double credits = jsonObject.getDouble("credits"); JSONObject intersection = jsonObject.getJSONObject("intersection"); double lng = intersection.getDouble("lng"); double lat = intersection.getDouble("lat"); String street1 = intersection.getDouble("street1"); String street2 = intersection.getDouble("street2");
  • 25. session fev 2016 Yann Caron (c) 2014 25 Data model  Le paradigme objet, par essence, tente de représenter toute entité sous forme d'un objet  Les données de l'application seront regroupées dans un module appelé data model  Better, faster lighter Java (Bruce Tate et Justin Gehtland)
  • 26. session fev 2016 Yann Caron (c) 2014 26 Data model class Intersection { final double lng, lat; final String street1, street2; // constructor public Intersection(double lng, double lat, String street1, String street2) { … } // getters public double getLng() { return lng; } public double getLat() { return lat; } public String getStreet1() { return street1; } public String getStreet2() { return street2; } } Final / immutabilité
  • 27. session fev 2016 Yann Caron (c) 2014 27 Data model  Bonne pratique : immutabilité, évite les effets de bord  Mapping (“maison”) JSON / Object  Problématique récurrente et fastidieuse Intersection dataIntersection = new Intersection(lng, lat, street1, street2);
  • 28. session fev 2016 Yann Caron (c) 2014 28 XML ?  L'ADK fournis des bibliothèques de parcours JSON et XML  Pour XML on peut utiliser 3 types de “parseurs” : ➔ DOM : Document Object Model, orienté objet ➔ SAX : Simple API for XML, mécanisme à base de callback (startDocument, startElement, endElement, endDocument) ➔ XmlPullParser : approche impérative (while / if, elseif), recommandé par Google
  • 29. session fev 2016 Yann Caron (c) 2014 29 IN01 – Séance 09 Asynctask
  • 30. session fev 2016 Yann Caron (c) 2014 30 AsyncTask  L'appel d'une ressource distante peut avoir un coût (temps)  Bloque l'interface utilisateur  L'ADK offre un outil pour gérer les tâches couteuses : la classe abstraite AsyncTask
  • 31. session fev 2016 Yann Caron (c) 2014 31 Principe  Créer une classe concrète qui hérite d'AsyncTask  Une classe (interne), locale et anonyme  Surcharger les méthodes : ➔ onPreExecute : exécuté avant l'exécution ➔ doInBackground : l'appel à la ressource bloquante ➔ onPostExecute : s'exécute après l'opération  Peut aussi gérer l'annulation de l'utilisateur ou la progression
  • 32. session fev 2016 Yann Caron (c) 2014 32 Code // Classe locale et anonyme new AsyncTask<Location, Void, String>() { ProgressDialog dialog; @Override protected void onPreExecute() { // UI thread dialog = ProgressDialog.show(MainActivity.this, "[titre]", "[message]", true, true); } @Override protected String doInBackground(Location... params) { // Autre thread return null; } @Override protected void onPostExecute(String res) { // UI thread dialog.dismiss(); } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, currentLocation); <Paramètre, Progression, Résultat> Ressource coûteuse Gestion de la boite de dialogue
  • 33. session fev 2016 Yann Caron (c) 2014 33 IN01 – Séance 09 Mapping avancé : Jackson
  • 34. session fev 2016 Yann Caron (c) 2014 34 Jackson  Jackson est une bibliothèque de serialization / Deserialisation au format JSON  Une extension permet de faire du XML  Utilise des POJOs (Plain Old Java Object); des objets Java sans artifice  “Under the hood”, utilise l'introspection de Java  Configuration du matching par annotation
  • 35. session fev 2016 Yann Caron (c) 2014 35 Project setting : Gradle
  • 36. session fev 2016 Yann Caron (c) 2014 36 Rappel : le fichier JSON { "credits":"1.0", "intersection": { "lng":"-122.180842", "lat":"37.450649", "street1":"Roble Ave", "street2":"Curtis St" } } Objet imbriqué
  • 37. session fev 2016 Yann Caron (c) 2014 37 Les Pojos correspondants public class IntersectionContainer { @JsonProperty("credits") public double version; public Intersection intersection; } public class Intersection { public double lng, lat; public String street1, street2; } Ou des accesseurs Annotation Attention ! Ce ne sont pas des BEANS
  • 38. session fev 2016 Yann Caron (c) 2014 38 Le parsing  Extrêmement simple !  Déduit le nom ou se sert des annotations: ➔ @JsonProperty (name) : specifie le nom Json ➔ @JsonIgnore () : ignore l'attribut ObjectMapper mapper = new ObjectMapper(); IntersectionContainer ic = mapper.readValue(JSON_DATA, IntersectionContainer.class);
  • 39. session fev 2016 Yann Caron (c) 2014 39 Annotation : intrusif  Dans le cas ou l'objet à “mapper” existe déjà dans une autre librairie  Solution : Utilisation des Mix-In annotations  Une interface qui contient les attributs et qui leur associe les annotations nécessaires
  • 40. session fev 2016 Yann Caron (c) 2014 40 Mix-In abstract class MixIn { @JsonProperty("credits") double version; } public static void main(String[] args) throws IOException { ObjectMapper mapper = new ObjectMapper(); mapper.addMixInAnnotations( IntersectionContainer.class, MixIn.class); IntersectionContainer ic = mapper.readValue( JSON_DATA, IntersectionContainer.class); } Association Specification
  • 41. session fev 2016 Yann Caron (c) 2014 41 Conclusion sur Jackson  Ce n'est pas l'unique bibliothèque de “mapping” XML (XStream)  Avantage : gère à la fois JSon et XML  Performances Android  Le mapping objet devient de plus en plus présent dans les applications. Standard de facto.
  • 42. session fev 2016 Yann Caron (c) 2014 42 IN01 – Séance 09 Coté serveurs
  • 43. session fev 2016 Yann Caron (c) 2014 43 Sur internet : Geonames  Base de données géographique  Service Météo METAR  Offre une interface complète de WebServices REST au format XML / JSON, mais aussi, CSV, RSS, KML  Exemples : Trouver l'intersection routière la plus proche (US) d'une position. Donner les données météo METAR de l'aéroport le plus proche de la position etc....
  • 44. session fev 2016 Yann Caron (c) 2014 44 Serveur local : RESTFull  Serveur REST en java (JAX-RS / GlassFish /JEE)  But : Synchroniser les données de l'appareil sur un serveur mutualisé  Principe, réaliser un “mapping” des tables de la base de données  http://mbaron.developpez.com/tutoriels/soa/d eveloppement-services-web-rest-jaxrs- netbeans/
  • 45. session fev 2016 Yann Caron (c) 2014 45 Architecture EDBMS / Rest client DBMS / Rest Server
  • 46. session fev 2016 Yann Caron (c) 2014 46 Fin  Merci de votre attention  Des questions ?