TP 5 Connexion à des services web REST

Objectifs du TP
Interrogation de services web REST à partir de votre application Android avec la bibliothèque Retrofit en suivant l'architecture MVVM.
I. Les web services
Un service Web est une norme utilisée pour échanger des informations entre des applications ou des systèmes de type hétérogène. Les applications logicielles écrites dans divers langages de programmation et s'exécutant sur diverses plates-formes peuvent utiliser des services Web pour échanger des informations sur Internet à l'aide du protocole http.
1.Le besoin d'utiliser le service Web dans les applications Android
Les applications Web existantes ont également besoin de créer des applications mobiles pour montrer leur présence dans la plate-forme mobile. Exposer les fonctionnalités existantes des applications est un peu difficile car toutes les fonctionnalités doivent être réécrites dans les plates-formes respectives. Mais il peut être facilement réalisé avec beaucoup de facilité en créant un service Web et en exposant les fonctionnalités existantes en tant que méthodes Web aux plateformes mobiles. Voici les quelques avantages de l'utilisation de Web Service sous Android: - Rendre le client plus léger. - Réutilisation des fonctionnalités existantes. - Utilisation d'une base de données distante.
Voici une architecture simplifée d'une application Android qui utilise des web services :

II. Retrofit
Retrofit est un client REST pour Android et Java, permettant de grouper et organiser toutes vos APIs de manière simple et propre. Les annotations sont utilisées pour contrôler les paramètres d’appel de l’API, définies dans des interfaces, que vous appelez à partir de classes. Toutes les APIs http sont représentées sous forme d’interfaces, comme suit :

1. Déclaration d’APIs :
Chaque méthode doit avoir une annotation http qui fournit la méthode utilisée ainsi que l’URL. 5 annotations sont fournies : GET, POST, PUT, DELETE et HEAD. Voici un exemple d’appel :

Il est possible de spécifier les paramètres de la requête dans l’URL :

Pour un remplacement dynamique de blocs et de paramètres dans la méthode, utiliser : {}, puis référencer ce bloc avec l’annotation @ PATH, comme suit :

Il est également possible d’utiliser des paramètres de requêtes (query parameters) comme suit :

L’URL résultante sera alors comme suit : group/id_val/users ?sort=sort_val
Pour insérer plusieurs paramètres de requête à la fois, utiliser une Map:

Consulter le site de Retrofit pour plus d’exemples d’utilisation de Retrofit.
2. Format de Données
Par défaut, Retrofit peut seulement dé-sérialiser les HTTP bodies en objets ResponseBody de la bibliothèque OkHttp, et n’accepte les requêtes que sous format RequestBody pour le @Body. Cependant, un ensemble de convertisseurs sont disponibles pour supporter d’autres types, dont Gson. Gson est une librairie Java utilisée pour convertir les objets Java en leur représentation JSON, et vice-versa.
Pour supporter Retrofit, il faut d’abord ajouter deux dépendances :
- Librairie Retrofit
- Gson
Activité 1
Créer un projet Android TP5. Ajouter les dépendances pour Retrofit et gson dans le fichier build.gradle (du Module), en insérant les lignes suivantes dans la partie dependencies:
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation 'com.squareup.retrofit2:converter-gson:2.3.0
N’oubliez pas de synchroniser le projet pour que les dépendances soient prises en compte !
III. Exercice : Accès à un Service Web
1. Objectif
Durée estimée de l’exercice : 2h
L’objectif de ce TP est de réaliser une application android qui accède à des données provenant d’un service web externe.

2. Génération des classes data à partir des données JSON
Le service web que nous appelons est un service public de consultation de météo. Pour consulter la météo actuelle à Tunis, nous utilisons l’URI suivante :http://api.openweathermap.org/data/2.5/weather?q=Tunis&APPID=17db59488cadcad345211c36304a9266
La réponse obtenue ressemble à la suivante :

Pour obtenir un APPID valide, il suffit de s’inscrire sur le site http://openweathermap.org , un APPID sera généré pour vous, vous le trouverez dans votre profil. Il suffira ensuite de remplacer le APPID de l’URI précédente par la votre. Une fois une réponse valide obtenue, sous la forme d’un document JSON comme le montre la figure précédente, il est possible de générer les classes POJO que vous allez utiliser pour manipuler les données du service web à votre guise. Pour cela :
• Copier la réponse que vous obtenez de l'API • Faites un clic droit sur le package et sélectionnez New-> Kotlin-data class from JSON • Donner à ce fichier un nom approprié.


3. Création de l’interface graphique
Commencer par créer l'interface graphique suivante :

4. Interface RestInterface
• Créer une interface appelée RestInterface dans votre projet. Cette interface permettra de mapper une URI donnée à un appel de méthode, grâce aux annotations fournies par l’API Retrofit. • Pour obtenir la météo de Tunis, le code de RestInterface devra être comme suit :
interface WeatherAPI {
@GET("weather?q=Tunis&APPID=17db59488cadcad345211c36304a9266")
fun getWeather() : Call<WeatherResponse>
}
Vous remarquerez ici que l’URI commence par weather. En effet, le path principal sera indiqué dans la classe principale, lors de l’appel du service.
5. Retrofit Builder
Créer une nouvelle classe RetrofitHelper et y insérer le code suivant. Retrofit Builder nous permet de construire la requête:
object RetrofitHelper {
private const val baseUrl ="https://api.openweathermap.org/data/2.5/"
/**
* The Retrofit object with Gson converter.
*/
private val retrofit = Retrofit.Builder().baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
// we need to add converter factory to
// convert JSON object to Java object
.build()
/**
* A public Api object that exposes the lazy-initialized Retrofit service
*/
val retrofitService : WeatherAPI by lazy { retrofit.create(WeatherAPI::class.java) }
}
Info
En Kotlin, les déclarations d'objets servent à déclarer des objets singleton. Le schéma singleton garantit qu'une seule et unique instance d'un objet est créée et qu'elle possède un point d'accès global à cet objet. Le langage Kotlin permet de déclarer facilement des singletons. Vous trouverez ci-dessous un exemple de déclaration d'objet et de son accès. Le nom de la déclaration d'objet est toujours suivi du mot clé object (objet).
// Object declaration
object DataProviderManager {
fun registerDataProvider(provider: DataProvider) {
// ...
}
val allDataProviders: Collection<DataProvider>
get() = // ...
}
// To refer to the object, use its name directly.
DataProviderManager.registerDataProvider(...)
L’URL utilisée ici est une chaîne statique représentant l’URL principale fixe du web service http://api.openweathermap.org/data/2.5/
Activité 2
- Faire le travail nécessaire, pour consommer l'API fournit afin d'afficher les données sur la météo de Tunis.
- Vous devez appliquer l'architecture MVVM vu en cours .
7. Ajout de paramètres
Nous aimerions maintenant que l’appel au web service soit paramétré. C’est à dire que le nom de la ville dont on va afficher la météo sera passé en paramètre à l’appel de la fonction getWeather, et non pas en dur directement dans RestInterface.
Activité 3
Ajouter un paramètre à la fonction getWeather.
8. Liste de Choix
Pour obtenir le résultat final, comme montré dans la partie II.1, il faut définir une liste déroulante (spinner), dans lequel on trouvera les noms des villes dont nous voulons afficher la météo.
Activité 4
Ajouter une liste déroulante à votre activité. Insérer les noms des villes de votre choix. Modifier votre code de façon à ce que l’appel au service web change selon le nom de la ville sélectionnée.
9. Liste des prévisions
On souhaite maintenant afficher la prévisions météorologiques à 16 jours.
Activité 5
- Ajouter un Button qui amène à une nouvelle Activity contenant un RecyclerView qui affiche la liste des prévisions métrologiques de la ville selectionnée.
- Penser à utiliser l'API suivant : lien
- Appliquer l'architecture MVVM.