Kotlin et les API : les trois piliers du développement moderne
\n\nAvez-vous déjà réfléchi à pourquoi certaines applications volent alors que d'autres ralentissent même sur des flagships ? Le secret réside souvent non pas dans le matériel, mais dans la façon dont elles communiquent avec le serveur. Si vous codez en Kotlin — que ce soit un backend avec Ktor ou une application Android — tôt ou tard, vous serez confronté au choix : REST, GraphQL ou gRPC ?
\n\nChez PythonLib, nous aimons comprendre les technologies dans les moindres détails. Aujourd'hui, nous allons décomposer trois approches pour travailler avec des API en Kotlin. Pas de blabla : seulement du code, des comparaisons et des cas réels. C'est parti !
\n\nAPI REST en Kotlin : un classique qui ne se démode pas
\n\nREST, c'est comme un costume noir : approprié partout, simple et compréhensible. En Kotlin, pour REST, il y a deux acteurs principaux : Ktor (pour la partie serveur) et Retrofit (pour la partie cliente).
\n\nServeur avec Ktor : écrivez une API en 5 minutes
\n\nKtor est un framework de JetBrains, créé spécialement pour Kotlin. Il est asynchrone, léger et n'impose pas de dépendances superflues.
\n\n// build.gradle.kts\nimplementation("io.ktor:ktor-server-netty:2.3.7")\nimplementation("io.ktor:ktor-server-content-negotiation:2.3.7")\nimplementation("io.ktor:ktor-serialization-kotlinx-json:2.3.7")\n\nEt maintenant le serveur lui-même :
\n\nimport io.ktor.server.engine.*\nimport io.ktor.server.netty.*\nimport io.ktor.server.routing.*\nimport io.ktor.server.response.*\nimport io.ktor.serialization.kotlinx.json.*\nimport io.ktor.server.plugins.contentnegotiation.*\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class User(val id: Int, val name: String, val email: String)\n\nfun main() {\n embeddedServer(Netty, port = 8080) {\n install(ContentNegotiation) {\n json()\n }\n routing {\n get("/api/users") {\n val users = listOf(\n User(1, "Анна", "anna@example.com"),\n User(2, "Борис", "boris@example.com")\n )\n call.respond(users)\n }\n get("/api/users/{id}") {\n val id = call.parameters["id"]?.toIntOrNull()\n if (id != null) {\n call.respond(User(id, "Тест", "test@example.com"))\n } else {\n call.respondText("Неверный ID", status = io.ktor.http.HttpStatusCode.BadRequest)\n }\n }\n }\n }.start(wait = true)\n}\n\nCe code est une API REST complète en Kotlin avec deux endpoints. Ktor sérialise automatiquement les données en JSON grâce à kotlinx.serialization.
Client avec Retrofit : connectez-vous à n'importe quelle API
\n\nRetrofit est le standard de facto pour le développement Android. Avec Kotlin, il fonctionne parfaitement grâce aux coroutines.
\n\n// build.gradle.kts\nimplementation("com.squareup.retrofit2:retrofit:2.9.0")\nimplementation("com.squareup.retrofit2:converter-gson:2.9.0")\nimplementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")\n\nDéclarons l'interface :
\n\ninterface ApiService {\n @GET("users")\n suspend fun getUsers(): List<User>\n\n @GET("users/{id}")\n suspend fun getUser(@Path("id") userId: Int): User\n\n @POST("users")\n suspend fun createUser(@Body user: User): User\n}\n\nCréons le client et effectuons une requête :
\n\nval retrofit = Retrofit.Builder()\n .baseUrl("https://api.example.com/")\n .addConverterFactory(GsonConverterFactory.create())\n .build()\n\nval service = retrofit.create(ApiService::class.java)\n\n// Dans une coroutine\nGlobalScope.launch {\n val users = service.getUsers()\n println(users)\n}\n\nAvantages de REST : simplicité, mise en cache via HTTP, immense communauté.
\nInconvénients : sur-récupération et sous-récupération de données — vous obtenez souvent plus ou moins que ce dont vous avez besoin.