26/04/2023
● Application Web : pages web
Types d’applications mobiles adaptées au Mobile (Mobile
Friendly UI)
● Application native : conçue spécialement pour le système
○ Avantage : une seule
cible (Android, iOS…)
Développement
technologie à utiliser.
1. Services Web ○ Meilleure rapidité, fiabilité et dotée d’une meilleure ● Application hybride : entre les
réactivité ainsi qu’une résolution supérieure ce qui assure deux : application spécifique
2. Architectures
Client/Serveur : ○
une meilleure expérience utilisateur.
Elle permet un accès plus facile à toutes les fonctionnalités
du téléphone, de l’accéléromètre en passant par la caméra
à chaque plateforme générée
de manière plus ou moins
3. Services Web REST automatique en utilisant des
Services Web 4. Services Web SOAP
○
et même le micro.
Les notifications push, uniquement disponibles sur les apps
natives. Ces notifications vous permettent d’alerter vos
technologies Web (HTML,
CSS,JS..)
utilisateurs et d’attirer leur attention chaque fois que vous ○ Avantage: coût du
le souhaitez. (voir GCM/FCM) développement.
○ Ne requiert pas forcément internet pour fonctionner, ce qui ○ Exemple d’outils: Cordova,
est un réel avantage. Même aujourd’hui, il existe encore des PhoneGap, Ionic...
zones très peu couvertes par le réseau internet, et
permettre à ses utilisateurs d’accéder à l’app sans
connexion web est un très gros point fort à ne pas négliger.
82 83
26/04/2023
Architecture logicielle distribuée Architecture distribuée et composants
Les services Web fournissent un lien entre Les services Web sont le moyen de communication
● La notion de composant logiciel est
applications. Ainsi, des applications utilisant principal entre composantes distantes d’une introduite comme une suite à la notion
des technologies différentes peuvent envoyer application distribuée. Ils utilisent des standards d’objet.
et recevoir des données au travers de ● Le composant offre une meilleure
(XML, HTTP,...) pour transférer des données et ils
structuration de l’application et permet
protocoles compréhensibles par tout le sont compatibles avec de nombreux autres de construire un système par
monde. environnements de développement. Ils sont donc assemblage de briques élémentaires en
indépendants des plates-formes. C'est dans ce favorisant la réutilisation de ces briques.
Cet ensemble d’applications en apparence ● Une application distante peut être
contexte qu'un intérêt très particulier a été attribué
autonomes mais en réalité dépendantes les modélisée comme un composant ou un
à la conception des services Web puisqu'ils ensemble de composants d’un système
unes des autres constituent une application distribué. (mais peut aussi faire partie
permettent aux entreprises d'offrir des applications
distribuée. d’un composant dans certains cas)
accessibles à distance par d'autres entreprises.
84 85
26/04/2023
1- Services Web Les services Web peuvent être codés en 2- Architectures
plusieurs langages (C#, Java, PHP, Ruby,
Les services Web sont des services de Python, C, etc.). Les principales architectures des étroitement lié au serveur. Si une
traitement de la donnée exposée sur internet. Web-Services sont REST et SOAP. modification est effectuée d'un côté ou de
Citation Dico du Net :
l'autre, l'ensemble peut ne plus fonctionner. Il
Ils peuvent avoir plusieurs formes, provenir REST et SOAP sont souvent comparés l'un à
“C’est une technologie permettant à des faut effectuer des mises à jour du client s'il y a
de plusieurs sites différents, faire des tâches l'autre, mais c'est une erreur. En effet, ces des changements sur le serveur et vice-versa.
applications de dialoguer à distance via éléments ne sont pas d'un même type : SOAP
diverses et être privés ou publics.
Internet indépendamment des plates-formes est à la fois une architecture et un protocole Avec REST il y a beaucoup moins de couplage
Exemples : tandis que REST est un style d'architecture. entre le client et le serveur : un client peut
et des langages sur lesquels elles reposent.”
● données météorologiques ; utiliser un service de type REST sans aucune
La différence majeure entre ces 2 connaissance de l'API. A l'inverse, un client
● calcul mathématique ; Les services web ne sont pas une exclusivité
“architectures” est le degré de liaison entre le SOAP doit tout savoir des éléments qu'il va
● stockage d'informations ; du développement mobile. client et le serveur. Un client développé avec utiliser pendant son interaction avec le
● etc. le protocole SOAP ressemble à un serveur, sinon cela ne fonctionnera pas.
programme locale (instanciation, appel de
méthodes…), car il est
86 87
26/04/2023
3- Architectures REST REST + JSON
Nous allons nous intéresser plus précisément aux services de type REST retournant des données
Les applications clientes Android peuvent tirer partie d'une architecture de type REST car de
nombreuses technologies côté serveur sont disponibles. Les principes de REST sont bien au format JSON (JavaScript Object Notation).
résumés sur la page wikipedia leurs étant dédiée:
Pourquoi REST? Avoir un grand degré de liberté et une indépendance entre programmes/APIs
● les données sont stockées dans le serveur permettant au client de ne s'occuper que de
l'affichage client et serveur.
● chaque requête est stateless c'est à dire qu'elle est exécutable du côté serveur sans que
celui-ci ait besoin de retenir l'état du client (son passé i.e. ses requêtes passées) Pourquoi le JSON? Pour une question de facilité, bien entendu on peut utiliser le XML qui est
● les réponses peuvent parfois être mises en cache facilitant la montée en charge
aussi facile, mais le JSON a la particularité d'être plus léger que XML, un gain de vitesse n'est pas
● les ressources (services) du serveur sont clairement définies; l'état du client est envoyé
par "morceaux" augmentant le nombre de requêtes. anodin dans le domaine de la mobilité. Par contre XML a l’avantage de la multitude des Parsers
Pour bâtir le service du côté serveur, un serveur PHP ou Tomcat peut faire l'affaire. Il pourra
fournir un web service, des données au format XML ou JSON. Du côté client, il faut alors (DOM, SAX, PULL..)
implémenter un parseur SAX ou d'objet JSON
88 89
26/04/2023
Exemple serveur : PHP -> JSON Exemple en PHP:
Exemple Serveur: PHP -> XML
function array2xml($array, $node_name="root") {
$json=array(); $dom = new DOMDocument('1.0', 'UTF-8');
$dom->formatOutput = true;
$sql="SELECT phone,name,isConnected FROM contacts ORDER BY name ASC";
$root = $dom->createElement($node_name);
try{ PHP : $dom->appendChild($root);
$res=$db->query($sql); $array=array(); $array2xml = function ($node, $array) use ($dom, &$array2xml) {
}catch(Exception $e){ // $array doit être foreach($array as $key => $value){
associatif if ( is_array($value) ) {
die(json_encode(array('error'=>$db->errorInfo()))); echo array2xml($array); $n = $dom->createElement($key);
} $array2xml($n, $value);
if($res){ }else
while($clt = $res->fetch(PDO::FETCH_ASSOC)){ $n = $dom->createElement($key,$value);
$json[]=$clt; $node->appendChild($n);
}
} };
$res->closeCursor();
} $array2xml($root, $array);
echo json_encode($json); return $dom->saveXML();
}
90 91
26/04/2023
Remarque: Il faut
Exemple Serveur: Spring -> JSON 3-1- Connexion du client (A)
aussi demander les
permissions
@RequestMapping("/api") nécessaires lors de
public class RestApiController { URL url = new URL("[Link]
import [Link];
HttpURLConnection conn = (HttpURLConnection) [Link](); l'exécution (en
import [Link];
import [Link]; @RequestMapping(value = "/user/", method = [Link])
try { plus de celles du
import [Link]; public ResponseEntity<List<User>> listAllUsers() {
import [Link]; List<User> users =findAllUsers(); [Link](true); Manifest)
import
if ([Link]()) {
[Link];
return new ResponseEntity(HttpStatus.NO_CONTENT); [Link](“POST”);
import [Link];
import } [Link](0);
[Link]; return new ResponseEntity<List<User>>(users, [Link]);
}
OutputStream out = new DataOutputStream([Link]());
● exemple complet : @RequestMapping(value = "/user/{id}", method = [Link]) // On peut utiliser out pour transmettre les paramètres et toute autre métadonnée
[Link] public ResponseEntity<?> getUser(@PathVariable("id") long id) {
[Link]("Fetching User with id {}", id);
t/spring-boot-rest-api-example/ User user =findUserById(id); InputStream inStream = new BufferedInputStream([Link]());
if (user == null) { String result = readStream(inStream); //passer de InputStream à String
[Link]("User with id {} not found.", id);
return new ResponseEntity(new CustomErrorType("User with id " + id } finally {
+ " not found"), HttpStatus.NOT_FOUND); [Link]();
}
return new ResponseEntity<User>(user, [Link]); }
}
92 93
26/04/2023
Stream to String NetworkOnMainThreadException
● Lecture du contenu depuis le stream : fonction readStream(...) dans l’exemple précédant
● Depuis Android 3.0, on ne peut pas effectuer des opérations de réseau
BufferedReader r = new BufferedReader(new InputStreamReader(inStream));
dans le thread d’une activité ou d’une interface graphique en général.
StringBuilder sb= new StringBuilder(); ● On peut le mettre dans un Thread traditionnel mais la communication
String line = null; entre un thread et une interface graphique est un peu difficile.
try { ● L’une des solutions les plus adaptées pour remédier à cela est d’utiliser
une tâche asynchrone (AsycTask) qui permet facilement de gérer à la fois
while ((line = [Link]()) != null) {
le code à exécuter en arrière plan (connexion..) et le code à exécuter dans
[Link](line).append('\n');
le thread principal (affichage des résultats).
}... ● Voir chapitre “Programmation concurrente”
String result = [Link]();
95
94
26/04/2023
3-2- Connexion avec Volley (B)
3-3- Récupération des objets : JSON
// un singleton Volley pour la gestion de la queue de requêtes
if (mRequestQueue == null) {
// Création d’un objet JSON depuis un String
mRequestQueue = [Link]([Link]()); JSONObject j = new JSONObject(result);
} // On peut vérifier l'existence de chaque clé et récupérer sa valeur directement
if([Link]("error")) Une fois le
StringRequest request = new StringRequest([Link], "[Link] new [Link]([Link],[Link]("error"),Toast.LENGTH_LONG).show();
else{ texte est
MyResponseListener(this), new MyErrorResponseListener());
[Link](request); Student std=new Student([Link]("id"),[Link]("nom"), récupéré du
[Link]("prenom"),[Link]("classe"));
class MyErrorResponseListener implements [Link]{
[Link]([Link]("phone"));
serveur sous
@Override
if([Link]("notes")){ forme de
public void onErrorResponse(VolleyError error) {
JSONArray ja=[Link]("notes");
Log.e(TAG,[Link]()); String, on le
for(int i=0; i<[Link]();i++){
} JSONObject jo=[Link](i); convertit en
} [Link]( objets JSON
private class MyResponseListener implements [Link]<String> { new Note([Link]("label"),[Link]("score"))
@Override );
}
public void onResponse(String data) {
}
//Convertir String data en objet JSON pour récupérer les informations transmises }
}
} 96
97
26/04/2023
//on peut aussi le lire à partir d’un fichier ou d’un service web
XML String result = new String("<plop><blup attr=\"45\">Coucou
Exemple: DOM Parser
!</blup></plop>");
Sans surprise, InputStream f = new ByteArrayInputStream([Link]()); Enfin, le parser DOM InputSource source = new InputSource(stream);
Android fournit XmlPullParser parser = [Link]();
permet de naviguer
try { DocumentBuilderFactory factory = [Link]();
plusieurs parsers XML assez facilement dans try {
[Link](f, null);
(Pull parser, Document la représentation DocumentBuilder builder = [Link]();
parser, Push parser). Document dom = [Link](source);
[Link](); arborescente du Element root = [Link]();
SAX et DOM sont [Link](this, [Link](), Toast.LENGTH_LONG).show();
document XML. Ce // Récupère tous les tags du descendant de la racine s'appelant monitor
disponibles. L'API de [Link]();
NodeList items = [Link]("monitor");
[Link](this, [Link](), Toast.LENGTH_LONG).show(); n'est évidemment pas
streaming (StAX) n'est for (int i=0;i<[Link]();i++){
[Link](this, [Link](null, "attr"), préconisé si le XML en Node item = [Link](i);
pas disponible.
Toast.LENGTH_LONG).show(); question est // Traitement:
Cependant, une [Link](); // [Link]()
librairie équivalente [Link](this, [Link](), Toast.LENGTH_LONG).show();
volumineux. L'exemple // [Link]()
est disponible: } ... suivant permet de // [Link]()
chercher tous les tags ...
XmlPullParser. Voici
}
un exemple simple: "monitor" dans les } catch (...)
sous-tags de la racine.
98 99
26/04/2023
kSOAP: exemple d’implémentation
public class AppelService {
4- Services Web de type SOAP private static final String NAMESPACE = "[Link]
private static final String URL = "[Link]
private static final String SOAP_ACTION = "getMeteo";
"
private static final String METHOD_NAME = "getMeteo";
Les services Web de type SOAP permettent une Le WSDL (Web Services Description Language) private String getMeteo(String ville) {
String meteo = null;
communication très rapprochée entre le client et try {
Le WSDL est une description fondée sur le XML qui SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
le serveur. Les deux parties de l’application sont indique comment utiliser le service. [Link]("ville", ville);
très liées ce qui en fait à la fois un avantage et un Le WSDL sert à décrire :
- le protocole de communication; SoapSerializationEnvelope envelope= new SoapSerializationEnvelope(SoapEnvelope.VER11);
inconvénient. [Link](request);
-le format de messages requis pour communiquer
avec ce service ; AndroidHttpTransport androidHttpTransport= new AndroidHttpTransport(URL);
Le SDK Android ne comporte pas d’API spécifique - la définition des méthodes qu'il est possible [Link](SOAP_ACTION, envelope);
pour les architectures SOAP, mais il existe d'appeler ; SoapObject objetSOAP = (SoapObject)[Link]();
- la localisation du service. meteo = [Link](objetSOAP);
plusieurs APIs Open Source exploitables à cet
} catch (Exception e) {
effet : la plus utilisée s’appelle kSOAP2. On peut Une description WSDL est un document XML qui Log.e("getMeteo", "", e);
télécharger et compiler la source avec notre commence par la balise "definitions" et qui contient }
les balises suivantes : }
projet ou inclure tout simplement le .jar adéquat - "binding" : définit le protocole à utiliser pour private String parserObjet(SoapObject objet) {
SoapObject meteoObjet = (SoapObject)[Link]("meteo");
comme “dependency”. invoquer le service web ;
String meteo = [Link]("temps").toString();
- "port" : spécifie l'emplacement actuel du service ;
-"service" : décrit un ensemble de points finaux du return meteo;
Détails sur l’API et téléchargement : réseau. }
[Link] 100 101
}
26/04/2023
Exercice : consommation d’un webservice REST
au format JSON
● En utilisant l’interface graphique réalisée précédemment dans le Nom
chapitre 3, et en utilisant le service web hébergé à l’URL suivante : Prénom
Classe
[Link]
○ développez le code qui permet de consommer le webservice et d’afficher
les données sur l’interface graphique dès l’ouverture de l’activité en
Remarques
utilisant l’API HttpURLConnection,
○ déplacez le traitement de la connexion dans une tâche asynchrone,
○ déclarez les autorisations nécessaires et faites les vérifications nécessaires
surtout pour l’état de la connectivité,
○ téléchargez l’image de profile et affichez la dans l’ImageView,
● Refaire le travail en utilisant l’API Volley
● Que doit-on faire pour enregistrer les modifications du profile?
ENREGISTRER
102