Progression Partie 4 sur 12

Préparons notre projet à accéder à Internet

Nous avons maintenant une clé d’API. Avant d’envoyer notre première requête, nous devons préparer l’application Android pour qu’elle puisse communiquer avec REST Countries.

Android demande aux applications de déclarer les fonctionnalités auxquelles elles souhaitent accéder. Pour effectuer des requêtes réseau, nous devons ajouter la permission INTERNET dans le fichier AndroidManifest.xml.

Ouvre le fichier app/src/main/AndroidManifest.xml

Ajoute la permission avant la balise <application> :

app/src/main/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

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

    <application
        ...>
    </application>

</manifest>

Installer Ktor Client

Ktor Client est une bibliothèque Kotlin permettant d’envoyer des requêtes HTTP et de traiter les réponses reçues.

Dans le fichier libs.versions.toml, ajoute la version de Ktor :

libs.versions.toml
[versions]
...
ktor = "3.5.1"
kotlinxSerializationJson = "1.11.0"
lifecycleViewmodelCompose = "2.11.0"

Ajoute ensuite les dépendances suivantes dans la section [libraries] :

libs.versions.toml
[libraries]
...
ktor-client-android = { group = "io.ktor", name = "ktor-client-android", version.ref = "ktor" }
ktor-client-content-negotiation = { group = "io.ktor", name = "ktor-client-content-negotiation", version.ref = "ktor" }
ktor-serialization-kotlinx-json = { group = "io.ktor", name = "ktor-serialization-kotlinx-json", version.ref = "ktor" }
kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" }

lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycleViewmodelCompose" }

Ajoute enfin ces dépendances dans le fichier app/build.gradle.kts :

app/build.gradle.kts
dependencies {
		...
    implementation(libs.ktor.client.android)
    implementation(libs.ktor.client.content.negotiation)
    implementation(libs.ktor.serialization.kotlinx.json)
    implementation(libs.kotlinx.serialization.json)
		
		 implementation(libs.lifecycle.viewmodel.compose)
}

Comprendre les dépendances

Regardons le rôle de chacune d’elles.

ktor-client-android

Cette dépendance fournit le moteur Android utilisé par Ktor pour effectuer les requêtes HTTP. Ktor sépare son API principale du moteur réseau. Cela permet d’utiliser un moteur différent selon la plateforme. Dans notre application Android, nous utilisons le moteur Android.

ktor-client-content-negotiation

Une réponse HTTP peut contenir différents formats de données, comme du HTML, du XML, du JSON, etc. Le plugin ContentNegotiation indique à Ktor comment traiter le contenu reçu. Dans notre cas, il permettra au client de reconnaître que la réponse de REST Countries contient du JSON.

ktor-serialization-kotlinx-json

Cette dépendance connecte Ktor à kotlinx.serialization. Grâce à elle, nous pourrons demander directement à Ktor de convertir la réponse JSON en une classe Kotlin : Sans cette dépendance, nous devrions lire et convertir manuellement le texte JSON.

kotlinx-serialization-json

Cette bibliothèque fournit les outils nécessaires pour lire et écrire du JSON avec kotlinx.serialization. Nous l’utiliserons notamment pour configurer la manière dont les réponses sont converties.

lifecycle-viewmodel-compose

Cette dépendance fournit l’intégration entre les ViewModel Jetpack et Jetpack Compose. Elle donne notamment accès à la fonction viewModel(), que nous utiliserons pour créer ou récupérer une instance de notre ViewModel depuis un composable.

Activer le plugin de sérialisation

Pour que Kotlin puisse générer le code nécessaire à la conversion JSON, nous devons également activer le plugin kotlinx.serialization. Dans le fichier version catalog ajoute :

libs.versions.toml
[plugins]
...
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }

Puis applique le plugin dans app/build.gradle.kts :

app/build.gradle.kts
plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.kotlin.compose)
    alias(libs.plugins.kotlin.serialization)
}

Nous utiliserons plus tard l’annotation @Serializable sur les classes qui représentent la réponse de l’API.

Après avoir ajouté les plugins et les dépendances, Clique sur Sync Now. Une fois la synchronisation terminée, notre application possède tout ce dont elle a besoin.

Dans la prochaine partie, nous allons créer et configurer le HttpClient qui sera responsable de toutes nos requêtes vers REST Countries.