#Appel réseaux et JSON

#Les bonnes pratiques

On pourrait simplement faire une requĂȘte rĂ©seau, transformer le JSON en un objet anonyme assez basique comme une Map<String, Any>, et afficher les donnĂ©es. Sauf qu’on ne va pas faire ça, c’est vraiment le pire choix de dĂ©veloppement possible.

#Pourquoi c’est nul

AspectPourquoi c’est nul
Type-safety‱ Runtime errors frĂ©quents
‱ Aucune vĂ©rification Ă  la compilation
‱ Casts manuels risquĂ©s
Maintenance‱ Structure des donnĂ©es non explicite
‱ Documentation API manquante
‱ Modifications de clĂ©s JSON difficiles Ă  tracer
Performance‱ Overhead mĂ©moire (structures dynamiques)
‱ Casts rĂ©pĂ©titifs Ă  l’exĂ©cution
‱ Pas d’optimisation par le compilateur
Productivité‹ Absence d’auto-complĂ©tion IDE
‱ Debuggage complexe
‱ Tests unitaires difficiles
Évolutivité‹ Changements d’API complexes Ă  gĂ©rer
‱ Versioning difficile
‱ Migration de donnĂ©es laborieuse

A l’inverse, comment faire pour que ce soit bien ? Et bien, on va utiliser une architecture avancĂ©e pour nous permettre d’ĂȘtre le plus type-safe et productif possible.

#Pourquoi c’est bien

AspectPourquoi c’est bien
Type-safety‱ VĂ©rification Ă  la compilation
‱ DĂ©tection prĂ©coce des erreurs
‱ Auto-complĂ©tion IDE complĂšte
Maintenance‱ Contrat API explicite (data classes)
‱ Documentation automatique
‱ Modifications traçables
Performance‱ GĂ©nĂ©ration de code Ă  la compilation
‱ Absence de reflection Ă  l’exĂ©cution
‱ Optimisations compilateur
Productivité‹ Mapping JSON ↔ Kotlin automatique
‱ Debuggage simplifiĂ©
‱ Tests unitaires faciles
Évolutivité‹ Gestion des versions API
‱ Migration contrĂŽlĂ©e
‱ Adapters personnalisables
FonctionnalitĂ©s‱ Gestion native des nullables
‱ Validations personnalisĂ©es
‱ Transformations de donnĂ©es

Pour faire des requĂȘtes rĂ©seaux il y a plĂ©htore de librairies disponibles. Contrairement Ă  iOS, sur Android il n’y a pas de librairie officielle pour faire des requĂȘtes rĂ©seaux.

Aussi OkHTTP est une des librairies les plus utilisĂ©es pour faire des requĂȘtes rĂ©seaux. OkHTTP est dĂ©veloppĂ© par Square, et est utilisĂ© par de nombreuses applications Android.

Square dĂ©veloppe Ă©galement Retrofit et Moshi aussi connus pour leur simplicitĂ© d’utilisation et leur inter-compatibilitĂ©.

#Rappel de notre objectif

Ici on va installer les éléments pour que cette architecture fonctionne.

#📩 Installer Retrofit

Lisez la documentation de Retrofit pour savoir comment l’installer.

Gradle Attention Ă  utiliser Gradle correctement avec libs.versions.toml

#Ressources

#🧠 Un peu de culture - Moshi

😖 Garder votre calme

  • Je vais vous aider avec les Ă©tapes, mais vous aurez surement pas mal de problĂšmes Ă  rĂ©soudre, et c’est normal, c’est pas du dev facile, restez patient et faites des pauses.
  • C’est en rĂ©solvant ces problĂšmes que vous allez apprendre le plus.

#Qu’est-ce que Moshi ?

  • Moshi vous permet de convertir les donnĂ©es JSON en objets Kotlin, et vice-versa.
  • Moshi peut se combiner avec Retrofit pour simplifier la conversion des donnĂ©es.

Alternatives

Il existe d’autres librairies comme Gson, Jackson, ou Kotlinx, mais j’aime bien Moshi. Vous ĂȘtes libre de choisir celle que vous prĂ©fĂ©rez.

#Comment ça marche ?

  • Moshi va gĂ©nĂ©rer des JsonAdapter pour chaque type de donnĂ©es que vous souhaitez convertir.
  • Vous pouvez soit les gĂ©nĂ©rer manuellement, soit utiliser le KSP pour les gĂ©nĂ©rer automatiquement.

#Les “JsonAdapter”

  • Les JsonAdapter sont des classes qui permettent de convertir les donnĂ©es JSON en objets Kotlin, et vice-versa.
  • On peut en dĂ©velopper manuellement, mais c’est fastidieux.
  • On peut utiliser le KSP pour les gĂ©nĂ©rer automatiquement.

Ne réinventez pas la roue

Il existe aussi des JsonAdapter pour les types particuliers comme les dates, quand elles ont un format standard (ISO, Rfc etc.)

#Utilisation de KSP pour générer les adapters

Moshi est une librairie qui permet de convertir des données JSON en objets Kotlin, et vice-versa. Pour simplifier la conversion des données, nous allons utiliser le KSP pour générer automatiquement les JsonAdapter pour chaque type de données que nous souhaitons convertir.

Dans cette partie vous allez sĂ»rement maudire le dĂ©veloppement Android / Java / Kotlin, car il y a beaucoup de configurations Ă  faire pour que tout fonctionne correctement. Mais une fois que tout est en place, vous verrez que c’est trĂšs pratique, et surtout, on s’approche de ce que vous allez vivre en entreprise.

#📩 Installer Moshi

#1. Installation de Moshi

Lisez la documentation de Moshi pour savoir comment l’installer : https://github.com/square/moshi

#2. Installation de KSP

Nous allons ajouter les dépendances nécessaires pour Moshi et KSP (Kotlin Symbol Processing) :

Subtilité

KSP est un plugin de compilation, il faut donc l’ajouter dans le fichier build.gradle.kts de votre module, dans la section plugins.

#3. Processor KSP pour Moshi

Ensuite il faut ajouter un processor KSP pour Moshi, qui va générer les adapters pour nous.

  • Lisez la documentation de Moshi ici : https://github.com/square/moshi#codegen, dans la section KSP
  • Vous devriez avoir besoin de rajouter seulement la dĂ©pendance com.squareup.moshi:moshi-kotlin-codegen:1.15.1, le plugin Ă  Ă©tĂ© rajoutĂ© Ă  l’étape d’avant.

A penser !

N’oubliez pas que les versions des dĂ©pendances dans les documentations sont souvent obsolĂštes ou sont des exemples, c’est Ă  vous de mettre Ă  jour les versions.

#💙 Moshi + Retrofit

Maintenant que tout est installé correctement, on va enfin pouvoir coder !

  1. Moshi doit ĂȘtre liĂ© Ă  Retrofit pour que les donnĂ©es soient automatiquement converties.
  2. Faites en sorte que Moshi dĂ©code automatiquement les donnĂ©es JSON en objets Kotlin, y compris les Dates (👀 les ressources).
  3. Créez un service Retrofit qui utilise Moshi pour les conversions.

Faites cela dans un fichier DwitchApiService.kt par exemple qui va ressembler à ça :

kotlin
interface DwitchService {
   // Vos requĂȘtes ici
}

val moshi = Moshi.Builder()
    //... Ajoutez vos adapters ici (notamment pour les dates)
    .build()

var retrofit = Retrofit.Builder()
    //... Les paramĂštres Retrofit ici (notamment un petit lien avec moshi)
    .build()

// Puis créez votre service
var dwitchService = retrofit.create(DwitchService::class.java)

Ressources

Permissions

N’oubliez pas de rajouter les permissions nĂ©cessaires dans le fichier AndroidManifest.xml pour accĂ©der Ă  internet.

#Coroutines & Retrofit

Pour faire des appels réseaux, on va utiliser des Coroutines pour rendre les appels asynchrones.

#Dans un viewModel

kotlin
viewModelScope.launch {
    try {
        val response = dwitchService.getOrders()
        // Faites quelque chose avec la réponse
    } catch (e: Exception) {
        // Gérez les erreurs
    }
}

#Dans un composable

#Via un SideEffect

kotlin
val rememberCoroutineScope = rememberCoroutineScope()

SideEffect {
    rememberCoroutineScope.launch {
        try {
            val response = dwitchService.getOrders()
            // Faites quelque chose avec la réponse
        } catch (e: Exception) {
            // Gérez les erreurs
        }
    }
}

#Via un LaunchedEffect

kotlin
val rememberCoroutineScope = rememberCoroutineScope()

LaunchedEffect(true) {
    try {
        val response = dwitchService.getOrders()
        // Faites quelque chose avec la réponse
    } catch (e: Exception) {
        // Gérez les erreurs
    }
}