Client HTTP en Kotlin : faire des requêtes correctement : de A à Z
Le développement moderne en Kotlin est impensable sans interaction réseau. Qu'il s'agisse d'une application Android, d'une solution serveur avec Ktor ou d'une application de bureau, les requêtes HTTP restent le principal moyen d'échanger des données. Dans cet article, nous allons voir comment organiser correctement un client HTTP en Kotlin, examiner les bibliothèques populaires et les meilleures pratiques.
Pourquoi Kotlin est-il idéal pour les requêtes HTTP ?
Kotlin offre une syntaxe moderne, une sécurité nulle et une compatibilité totale avec l'écosystème Java. Grâce aux coroutines et aux API fluides, le travail avec le réseau devient propre et asynchrone. Les principaux avantages :
- Coroutines — des threads légers pour les opérations asynchrones sans blocage
- Constructeurs type-safe — construction pratique des requêtes HTTP
- Classes scellées — gestion élégante des états de réponse
- Fonctions d'extension — extension des fonctionnalités des bibliothèques
Choix du client HTTP pour Kotlin
Aujourd'hui, trois bibliothèques dominent l'écosystème Kotlin : OkHttp, Ktor Client et Retrofit. Examinons chacune avec des exemples de code.
1. OkHttp — un choix éprouvé par le temps
OkHttp de Square est le client HTTP le plus populaire pour JVM. Il est efficace, prend en charge HTTP/2, la compression automatique et la mise en cache.
// build.gradle.ktsimplementation("com.squareup.okhttp3:okhttp:4.12.0")
// Exemple de requête GET avec OkHttpimport okhttp3.OkHttpClientimport okhttp3.Requestimport kotlinx.coroutines.Dispatchersimport kotlinx.coroutines.withContext
class OkHttpExample { private val client = OkHttpClient.Builder() .connectTimeout(30, java.util.concurrent.TimeUnit.SECONDS) .readTimeout(30, java.util.concurrent.TimeUnit.SECONDS) .build()
suspend fun fetchData(url: String): String = withContext(Dispatchers.IO) { val request = Request.Builder() .url(url) .header("Accept", "application/json") .build()
client.newCall(request).execute().use { response -> if (!response.isSuccessful) { throw RuntimeException("Erreur : ${response.code}") } response.body?.string() ?: throw RuntimeException("Réponse vide") } }}2. Ktor Client — le choix natif pour Kotlin
Ktor Client fait partie de l'écosystème JetBrains, entièrement écrit en Kotlin avec un support multiplateforme. Idéal pour les serveurs Ktor et les projets Android/iOS.
// build.gradle.ktsimplementation("io.ktor:ktor-client-core:2.3.7")implementation("io.ktor:ktor-client-cio:2.3.7")implementation("io.ktor:ktor-client-content-negotiation:2.3.7")implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.7")
import io.ktor.client.*import io.ktor.client.call.*import io.ktor.client.engine.cio.*import io.ktor.client.plugins.contentnegotiation.*import io.ktor.client.request.*import io.ktor.client.statement.*import io.ktor.serialization.kotlinx.json.*import kotlinx.serialization.Serializable
@Serializabledata class Post(val userId: Int, val id: Int, val title: String, val body: String)
class KtorExample { private val client = HttpClient(CIO) { install(ContentNegotiation) { json(Json { ignoreUnknownKeys = true isLenient = true }) } engine { requestTimeout = 30_000 } }
suspend fun getPost(id: Int): Post { val response: HttpResponse = client.get("https://jsonplaceholder.typicode.com/posts/$id") return response.body() }
suspend fun createPost(post: Post): Post { val response: HttpResponse = client.post("https://jsonplaceholder.typicode.com/posts") { setBody(post)