Client HTTP en Kotlin : effectuer des requêtes correctement de A à Z
\nLe développement moderne en Kotlin est impensable sans interaction avec des serveurs distants. Qu'il s'agisse d'une application mobile Android ou d'une solution serveur avec Ktor, les requêtes HTTP sont le fondement de l'échange de données. Dans cet article, nous allons voir comment créer des clients HTTP en Kotlin en utilisant les meilleures pratiques, les bibliothèques populaires et une approche moderne avec les coroutines. Vous apprendrez à effectuer des requêtes GET et POST, à gérer les erreurs, à travailler avec JSON et à construire une architecture de couche réseau fiable.
\n\nPourquoi Kotlin est-il idéal pour les clients HTTP ?
\nKotlin offre une syntaxe concise, une sécurité nulle (null safety) et une compatibilité totale avec l'écosystème Java. Grâce aux coroutines, les requêtes asynchrones deviennent intuitives, sans callbacks lourds. Vous pouvez écrire un code séquentiel qui s'exécute de manière asynchrone, ce qui simplifie grandement la lecture et le débogage. De plus, Kotlin est largement utilisé dans le développement Android, où les requêtes réseau sont une tâche quotidienne.
\n\nBibliothèques principales pour HTTP en Kotlin
\nAujourd'hui, trois approches sont les plus populaires :
\n- \n
- Ktor Client — un client multiplateforme de JetBrains. Il prend en charge JVM, Android, iOS, JS et Native. Idéal pour les projets nécessitant une base de code unique. \n
- OkHttp + Retrofit — la pile classique pour Android/JVM. OkHttp gère le travail réseau de bas niveau, tandis que Retrofit génère des interfaces typées. \n
- Fuel — une bibliothèque légère avec une approche fonctionnelle. Convient aux petits projets. \n
Dans cet article, nous nous concentrerons sur Ktor et OkHttp, car ils couvrent 90 % des scénarios.
\n\nConfiguration du projet et premières requêtes
\nPour commencer, ajoutons les dépendances. Si vous utilisez Gradle (Kotlin DSL), incluez Ktor Client :
\ndependencies {\n implementation("io.ktor:ktor-client-core:2.3.7")\n implementation("io.ktor:ktor-client-cio:2.3.7") // moteur CIO\n implementation("io.ktor:ktor-client-content-negotiation:2.3.7")\n implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.7")\n}\nPour OkHttp, les dépendances seront les suivantes :
\ndependencies {\n implementation("com.squareup.okhttp3:okhttp:4.12.0")\n implementation("com.squareup.okhttp3:logging-interceptor:4.12.0")\n implementation("com.google.code.gson:gson:2.10.1")\n}\n\nRequête GET avec Ktor Client
\nCréons un client simple et effectuons une requête GET vers une API publique :
\nimport io.ktor.client.*\nimport io.ktor.client.request.*\nimport io.ktor.client.statement.*\n\nsuspend fun fetchData(): String {\n val client = HttpClient()\n val response: HttpResponse = client.get("https://jsonplaceholder.typicode.com/posts/1")\n val body = response.bodyAsText()\n client.close()\n return body\n}\n\n// Utilisation dans une coroutine\nfun main() = runBlocking {\n println(fetchData())\n}\nRemarque : suspend est le mot-clé Kotlin pour les fonctions suspendues. Cela permet d'exécuter la requête sans bloquer le thread.
Requête GET avec OkHttp
\nUn exemple similaire avec OkHttp ressemble à ceci :
\nimport okhttp3.OkHttpClient\nimport okhttp3.Request\n\nfun fetchDataSync(): String {\n val client = OkHttpClient()\n val request = Request.Builder()\n .url("https://jsonplaceholder.typicode.com/posts/1")\n .build()\n client.newCall(request).execute().use { response ->\n return response.body?.string() ?: "Erreur"\n }\n}\n\n// Appel dans un thread normal (bloquant)\nfun main() {\n println(fetchDataSync())\n}\nOkHttp est synchrone par défaut, mais il peut facilement être adapté aux coroutines avec suspendCancellableCoroutine.
Requêtes POST et travail avec JSON
\nL'envoi de données est la deuxième opération la plus importante. Voyons comment envoyer un JS