• 10 hours
  • Easy

Free online content available in this course.

course.header.alt.is_certifying

Got it!

Last updated on 3/12/24

Faites une demande réseau

Vous recevez un message de la part de Margaret :

J'ai entendu dire que tu allais commencer les demandes réseau. Juste un petit conseil : si tu veux faciliter les choses, envisage d'utiliser Retrofit pour ses performances et sa facilité d'utilisation, comme le recommande Grace, notre spécialiste en communication entre application et serveurs. 👍

Je sais que cela peut sembler un peu intimidant au début, mais imagine cela comme une discussion entre deux ordinateurs. C'est une opportunité pour nos machines de se comprendre et de collaborer de manière efficace. 

Découvrez Retrofit

Bienvenue dans l'univers de Retrofit, un outil conçu pour établir des connexions réseau fluides dans votre application Android.

Imaginez votre application comme un client dans un restaurant. Retrofit agit comme le maître d'hôtel qui prend vos commandes (requêtes réseau) et les transmet à la cuisine (les serveurs distants où résident les données météorologiques). L'objectif est d'assurer la communication entre le client (votre application) et la cuisine (les serveurs distants), garantissant ainsi la récupération précise des plats (informations météorologiques) que vous recherchez.

Concrètement, avec Retrofit, vous déclarez vos appels réseau dans une interface dédiée. C'est comme si vous aviez un maître d'hôtel personnel qui noterait vos commandes (requêtes réseau) et vous apporterait les données demandées (réponses du serveur).

Métaphore du restaurant
Métaphore du restaurant

OK, mais concrètement, ça sert à quoi Retrofit ?

Très bonne question ! Voici les avantages à retenir :

  1. Simplicité : Avec Retrofit, vous définissez vos appels réseau dans une interface, ce qui simplifie la lecture et la maintenance du code.

  2. Gestion d'erreurs intégrée : Retrofit facilite la gestion des erreurs de réseau, simplifiant la prise en charge des cas où quelque chose ne se passe pas comme prévu.

  3. Routing automatisé : Vous spécifiez l'endpoint dans votre interface, et Retrofit se charge du reste, simplifiant la gestion des chemins de données.

Maintenant que nous avons exploré l'univers de Retrofit, il est temps de l'intégrer dans votre projet Android. Nous allons détailler chaque étape du processus.

Créez des endpoints

Nous connaissons déjà le menu, avec les objets OpenWeatherForecastsResponse  ; il ne nous reste plus qu'à passer commande ! Il est temps de donner vie à notre communication avec l'API météo en implémentant des endpoints. Pensez à ces endpoints comme aux destinations spécifiques sur le serveur où vous pouvez obtenir des informations météorologiques précises.

Suivez ces étapes pour créer une interface dédiée à ces endpoints :

Étape 1 : Créez une interface en rentrant le nom  data.network.WeatherClient  et en sélectionnant Interface.

Création d'une interface
Création d'une interface

Étape 2 : Android Studio crée alors automatiquement plusieurs dossiers et un fichier nommé WeatherClient ; copiez ce code dedans :

import com.openclassrooms.stellarforecast.data.response.OpenWeatherForecastsResponse
import retrofit2.Response
import retrofit2.http.GET
import retrofit2.http.HeaderMap
import retrofit2.http.Query
interface WeatherClient {
@GET("/data/2.5/forecast")
suspend fun getWeatherByPosition(
@Query(value = "lat") latitude: Double,
@Query(value = "lon") longitude: Double,
@Query(value = "appid") apiKey: String
): Response<OpenWeatherForecastsResponse>
}

Étape 3 : Dans ce code, nous avons défini une interface appelée WeatherClient, qui va jouer un rôle important dans la communication de votre application avec un service météorologique distant.

Analysons cela :

1/ Interface WeatherClient :

  • Cette interface déclare une méthode appelée  getWeatherByPosition  .

  • Le mot-clé suspend indique que cette méthode peut être suspendue, ce qui signifie qu'elle peut être utilisée de manière asynchrone dans des fonctions coroutine, une notion que vous pourrez explorer plus tard dans ce cours.

  • Le type de retour est Response<OpenWeatherResponse> : La fonction renvoie un objet Response de la bibliothèque Retrofit. Cette enveloppe contient la réponse HTTP du serveur, ainsi que le corps de la réponse en utilisant le modèle défini par OpenWeatherResponse.

2/ Annotation @GET("/data/2.5/forecast") :

  • Cette annotation indique que la méthode getWeatherByPosition effectuera une requête HTTP GET à l'URL spécifié, ici "/data/2.5/forecast". L'URL complète sera construite en fonction de la base de l'URL définie dans la configuration Retrofit. Pour rappel, l’URL complet ressemblera à ceci :

http://api.openweathermap.org/data/2.5/forecast?lat=40.7128&lon=-74.0060&appid=votre_cle_api

3/ Paramètres de la méthode :

  • @Query(value = "lat") latitude: Float : Cela représente la latitude de la position pour laquelle nous voulons obtenir la météo.

  • @Query(value = "lon") longitude: Float : De même, cela représente la longitude de la position.

  • @Query(value = "appid") apiKey: String : Ceci est la clé API qui sera utilisée pour authentifier notre application auprès du service météorologique.

En résumé, cette interface définit un moyen structuré d'interagir avec l'API météo. La méthode  getWeatherByPosition  permet d'obtenir des informations météorologiques en spécifiant la position (latitude et longitude) et en incluant une clé API dans la requête. Ce code deviendra plus clair au fur et à mesure que vous vous familiariserez avec les concepts de Retrofit et de communication réseau dans le développement Android.

Intégrez Retrofit dans le projet

Maintenant, le point crucial : intégrer Retrofit avec Hilt. Jusqu’à maintenant, nous n’avons que défini les endpoints (chemin d'accès aux données, le chemin pour aller de la salle du restaurant aux cuisines) ; nous allons à présent configurer Retrofit (recruter notre maître d'hôtel) pour communiquer avec les serveurs.

En somme, intégrer Retrofit dans votre projet avec Hilt vous permet d'établir des connexions réseau tout en maintenant une structure de code propre et maintenable.

Créez un nouveau fichier de type Object nommé  di.NetworkModule  depuis le nom de l’application, comme fait précédemment.

Création d'un objet
Création d'un objet

Puis copiez le code suivant dans ce nouveau fichier :

import com.openclassrooms.stellarforecast.data.network.WeatherClient
import com.squareup.moshi.Moshi
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.moshi.MoshiConverterFactory
import javax.inject.Singleton
 
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {
 
   // Provides a singleton instance of Retrofit for network communication
   @Singleton
@Provides
fun provideRetrofit(): Retrofit {
return Retrofit.Builder()
.baseUrl("https://api.openweathermap.org")
.addConverterFactory(
MoshiConverterFactory.create(
Moshi.Builder().add(KotlinJsonAdapterFactory()).build()
)
)
           .client(provideOkHttpClient()) // Uses a separate function for OkHttpClient configuration
           .build()
}
 
   // Provides a singleton instance of WeatherClient using Retrofit
   @Singleton
@Provides
fun provideWeatherClient(retrofit: Retrofit): WeatherClient {
       return retrofit.create(WeatherClient::class.java)
}
 
   // Private function to configure OkHttpClient with an interceptor for logging
   private fun provideOkHttpClient(): OkHttpClient {
       return OkHttpClient.Builder().apply {
           addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
       }.build()
}
}

Voyons en détail ce que cette méthode contient :

  • provideRetrofit : Cette fonction fournit une instance unique de Retrofit pour la communication réseau. Elle utilise Moshi comme convertisseur JSON, avec l'ajout du KotlinJsonAdapterFactory pour une meilleure compatibilité avec les classes Kotlin. La configuration d'OkHttpClient est extraite dans une fonction séparée pour plus de clarté ;

  • provideWeatherClient : Cette fonction fournit une instance unique de WeatherClient utilisant Retrofit. Elle dépend de l'instance de Retrofit fournie par provideRetrofit ;

  • provideOkHttpClient : Cette fonction configure et fournit une instance d'OkHttpClient avec un intercepteur pour les logs. Elle est utilisée dans provideRetrofit.

Dans cet exemple, la classe  NetworkModule  joue un rôle crucial dans la mise en place de la communication réseau au sein de votre application Android. Elle est annotée avec@Modulepour indiquer à Hilt (injection de dépendances) à qui elle fournit des dépendances pour l'application. L'annotation@InstallIn(ApplicationComponent::class)spécifie que les dépendances fournies par ce module seront disponibles au niveau du composant d'application, ce qui signifie qu'elles seront accessibles pendant toute la durée de vie de l'application. Elle fournit des instances de Retrofit et de l'interface WeatherClient. La première fonction fournit l'instance de Retrofit, tandis que la seconde fournit le service de l'API météo.

Assurez-vous de bien comprendre cette configuration, car elle est cruciale pour garantir que votre application utilise Retrofit de manière optimale.

Rajoutez dans le fichier AndroidManifest.xml cette ligne de code, avant la balise ouvrante de <application>. Cela permettra à votre application d’avoir accès au WiFi et à la 4G/5G de votre téléphone.

<uses-permission android:name="android.permission.INTERNET"/>

À vous de jouer

Contexte

Votre application progresse de manière positive, et tandis que les premières neiges ne sont pas encore tombées, c'est le moment opportun pour mettre en place Retrofit et définir les points d'accès dans votre projet. Dans un souci de maintenabilité et de propreté du code, vous avez pris la décision judicieuse d'adopter Hilt pour la gestion des dépendances.

Consignes

Votre mission actuelle consiste à :

  • définir une classe NetworkModule ;

  • déclarer une classe pour les endpoints (type WeatherClient, dans le cours).

Corrigé

Le corrigé est disponible sur GitHub à cette adresse

  • Définition du NetworkModule.

  • Déclaration de WeatherClient.

En résumé

  • Retrofit simplifie les échanges réseau dans votre application Android en jouant le rôle d'un maître d'hôtel, offrant une approche simple, une gestion intégrée des erreurs, et une automatisation du routage.

  • Les endpoints sont des destinations ciblées pour obtenir des informations précises. L'interface WeatherClient établit des méthodes pour interagir avec l'API météo. La fonction  getWeatherByPosition  spécifie les paramètres de requête et retourne une Response contenant les données nécessaires.

  • Hilt simplifie la gestion des dépendances dans l'application. L'annotation  @HiltAndroidApp  et les modules  @Module  et  @Provides  permettent à Hilt de générer automatiquement le code nécessaire. 

Félicitations, Retrofit est configuré et les endpoints sont définis, il ne nous reste plus qu'à faire cet appel ! Appelez-moi ce serveur : “Garçon, s’il vous plaît !”.

Example of certificate of achievement
Example of certificate of achievement