Client HTTP en Kotlin : faire des requêtes correctement — niveau avancé

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Client HTTP en Kotlin : faire des requêtes correctement — niveau avancé



Lors du développement d'applications modernes en Kotlin, la gestion des requêtes HTTP va bien au-delà du simple appel à URL.readText(). Au niveau avancé, il est nécessaire de prendre en compte la gestion des connexions, les timeouts, les tentatives de reprise, la journalisation, l'asynchronisme et la gestion correcte des erreurs. Dans cet article, nous allons voir comment configurer un client HTTP en Kotlin pour un environnement de production, en utilisant deux bibliothèques populaires : OkHttp et Ktor Client. Ce contenu est destiné aux développeurs déjà familiarisés avec les bases de Kotlin et de HTTP.



1. Choix de la bibliothèque : OkHttp vs Ktor Client

Avant d'écrire du code, il est important de comprendre la différence entre les approches. OkHttp est une bibliothèque mature et éprouvée de Square, qui fonctionne très bien avec Retrofit. Ktor Client est une bibliothèque native multiplateforme de JetBrains, entièrement intégrée aux coroutines Kotlin. Pour les projets serveur sur Spring Boot, on choisit souvent OkHttp, tandis que pour les applications Ktor ou les projets multiplateformes, on opte pour Ktor Client.



Nous allons examiner les deux options afin que vous puissiez choisir celle qui convient à votre stack.



2. Configuration avancée d'OkHttp

La configuration de base d'OkHttp est triviale, mais pour la production, une configuration fine est nécessaire. Voyons la création d'un client Singleton avec des paramètres personnalisés.



import okhttp3.*import java.util.concurrent.TimeUnit

object HttpClientProvider {

private val client: OkHttpClient by lazy { OkHttpClient.Builder() .connectTimeout(30, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .writeTimeout(30, TimeUnit.SECONDS) .retryOnConnectionFailure(true) .addInterceptor(LoggingInterceptor()) .addInterceptor(RetryInterceptor(maxRetries = 3)) .connectionPool(ConnectionPool(5, 5, TimeUnit.MINUTES)) .build() }

fun getClient(): OkHttpClient = client}


2.1 Intercepteurs personnalisés (Interceptors)

Les intercepteurs sont un mécanisme puissant pour modifier les requêtes et les réponses. Voici un exemple d'intercepteur de journalisation et d'intercepteur pour les tentatives de reprise.



class LoggingInterceptor : Interceptor {    override fun intercept(chain: Interceptor.Chain): Response {        val request = chain.request()        println("--> ${request.method} ${request.url}")        val startTime = System.nanoTime()        val response = chain.proceed(request)        val duration = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime)        println("<-- ${response.code} ${response.message} (${duration}ms)")        return response    }}

class RetryInterceptor(private val maxRetries: Int) : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { var retryCount = 0 var response: Response? = null while (retryCount < maxRetries) { try { response = chain.proceed(chain.request()) if (response.isSuccessful) return response } catch (e: Exception) { println("Tentative #${retryCount + 1} échouée : ${e.message}") } retryCount++ if (retryCount < maxRetries) Thread.sleep(1000L * retryCount) } return response ?: throw IOException("Nombre maximal de tentatives dépassé") }}


2.2 Requêtes asynchrones avec les coroutines

OkHttp prend en charge les requêtes synchrones et asynchrones (basées sur des callbacks). Pour l'intégration avec les coroutines Kotlin, nous utilisons suspendCancellableCoroutine.



suspend fun makeRequest(url: String): String {    return suspendCancellableCoroutine { continuation ->        val request = Request.Builder().url(url).build()        val call = HttpClientProvider.getClient().newC                

Blogs

Book Recommendations