Client HTTP en Kotlin : faire des requêtes correctement
Le développement moderne sous Android et les services backend en Kotlin se passe rarement d'interaction avec des API distantes. Créer un client HTTP fiable est une tâche fondamentale dont la bonne résolution dépend de la stabilité de toute l'application. Dans cet article, nous allons voir comment effectuer des requêtes HTTP en Kotlin en utilisant les deux bibliothèques les plus populaires : Ktor Client et OkHttp. Vous apprendrez à envoyer des requêtes GET et POST, à traiter le JSON, à gérer les erreurs et à écrire un code propre et maintenable.
Pourquoi Ktor Client est le choix du développeur Kotlin moderne
Ktor Client est un client HTTP asynchrone créé spécialement pour Kotlin par l'équipe JetBrains. Il prend entièrement en charge les coroutines, ce qui rend le code concis et sûr. Contrairement à OkHttp, Ktor est conçu dès le départ pour la multiplateforme : le même code fonctionne sur Android, iOS, JVM, JS et Native.
Installation des dépendances
Pour travailler avec Ktor Client, ajoutez les dépendances suivantes dans le fichier build.gradle.kts :
dependencies { // Client de base implementation("io.ktor:ktor-client-core:2.3.7") // Moteur pour JVM (OkHttp ou CIO) implementation("io.ktor:ktor-client-okhttp:2.3.7") // Pour la sérialisation JSON implementation("io.ktor:ktor-client-content-negotiation:2.3.7") implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.7") // Kotlinx Serialization implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2")}Requête GET simple
Créons un client HTTP et effectuons une requête GET vers une API de test (JSONPlaceholder) :
import io.ktor.client.*import io.ktor.client.request.*import io.ktor.client.statement.*import kotlinx.coroutines.runBlocking
suspend fun fetchUser(userId: Int): String { val client = HttpClient { // Configuration de base engine { // Paramètres du moteur OkHttp } } val response: HttpResponse = client.get("https://jsonplaceholder.typicode.com/users/$userId") return response.bodyAsText()}
fun main() = runBlocking { val userData = fetchUser(1) println(userData)}Notez que fetchUser est une fonction suspend. Cela permet de l'appeler depuis une coroutine sans bloquer le thread.
Requête POST avec corps JSON
Pour envoyer des données au format JSON, connectons le plugin ContentNegotiation et définissons une data-class :
import io.ktor.client.*import io.ktor.client.call.*import io.ktor.client.plugins.contentnegotiation.*import io.ktor.client.request.*import io.ktor.http.*import io.ktor.serialization.kotlinx.json.*import kotlinx.serialization.Serializableimport kotlinx.serialization.json.Json
@Serializabledata class Post(val userId: Int, val id: Int? = null, val title: String, val body: String)
suspend fun createPost(post: Post): Post { val client = HttpClient { install(ContentNegotiation) { json(Json { ignoreUnknownKeys = true prettyPrint = true }) } } val response: Post = client.post("https://jsonplaceholder.typicode.com/posts") { contentType(ContentType.Application.Json) setBody(post) }.body() client.close() return response}
fun main() = runBlocking { val newPost = Post(userId = 1, title = "Ktor Client", body = "Fonctionne parfaitement !") val createdPost = createPost(newPost) println(createdPost)}Point clé : le plugin ContentNegotiation sérialise automatiquement l'objet en JSON et désérialise la réponse en data-class.
OkHttp — le standard éprouvé pour Android
OkHttp reste le standard de facto pour les requêtes réseau dans le développement Android. Il est rapide, fiable et prend en charge p