HTTP-Client in Kotlin: Anfragen richtig stellen von A bis Z
\nModerne Entwicklung mit Kotlin ist ohne die Interaktion mit entfernten Servern undenkbar. Ob es sich um eine mobile App auf Android oder eine serverseitige Lösung mit Ktor handelt – HTTP-Anfragen sind die Grundlage des Datenaustauschs. In diesem Artikel werden wir uns ansehen, wie man HTTP-Clients in Kotlin erstellt, unter Verwendung bewährter Methoden, beliebter Bibliotheken und des modernen Ansatzes mit Coroutines. Sie erfahren, wie Sie GET- und POST-Anfragen stellen, Fehler behandeln, mit JSON arbeiten und eine zuverlässige Architektur der Netzwerkschicht aufbauen.
\n\nWarum ist Kotlin ideal für HTTP-Clients?
\nKotlin bietet eine prägnante Syntax, Null-Sicherheit (null safety) und vollständige Kompatibilität mit dem Java-Ökosystem. Dank Coroutines werden asynchrone Anfragen intuitiv verständlich, ohne umständliche Callbacks. Sie können sequenziellen Code schreiben, der asynchron ausgeführt wird – das vereinfacht das Lesen und Debuggen erheblich. Darüber hinaus wird Kotlin aktiv in der Android-Entwicklung eingesetzt, wo Netzwerkanfragen eine alltägliche Aufgabe sind.
\n\nWichtige Bibliotheken für HTTP in Kotlin
\nHeutzutage sind drei Ansätze am beliebtesten:
\n- \n
- Ktor Client – ein plattformübergreifender Client von JetBrains. Unterstützt JVM, Android, iOS, JS und Native. Ideal für Projekte, die eine einheitliche Codebasis benötigen. \n
- OkHttp + Retrofit – der klassische Stack für Android/JVM. OkHttp ist für die low-level Netzwerkarbeit zuständig, während Retrofit typisierte Schnittstellen generiert. \n
- Fuel – eine leichte Bibliothek mit einem funktionalen Ansatz. Geeignet für kleinere Projekte. \n
In diesem Artikel konzentrieren wir uns auf Ktor und OkHttp, da sie 90% der Szenarien abdecken.
\n\nProjekt einrichten und erste Anfragen
\nZunächst fügen wir die Abhängigkeiten hinzu. Wenn Sie Gradle (Kotlin DSL) verwenden, binden Sie den Ktor Client ein:
\ndependencies {\n implementation("io.ktor:ktor-client-core:2.3.7")\n implementation("io.ktor:ktor-client-cio:2.3.7") // CIO-Engine\n implementation("io.ktor:ktor-client-content-negotiation:2.3.7")\n implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.7")\n}\nFür OkHttp sehen die Abhängigkeiten wie folgt aus:
\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\nGET-Anfrage mit Ktor Client
\nErstellen wir einen einfachen Client und führen eine GET-Anfrage an eine öffentliche API durch:
\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// Verwendung in einer Coroutine\nfun main() = runBlocking {\n println(fetchData())\n}\nBeachten Sie: suspend ist das Kotlin-Schlüsselwort für unterbrechbare Funktionen. Dies ermöglicht die Ausführung der Anfrage ohne Blockierung des Threads.
GET-Anfrage mit OkHttp
\nEin ähnliches Beispiel mit OkHttp sieht so aus:
\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() ?: "Fehler"\n }\n}\n\n// Aufruf im normalen Thread (blockierend)\nfun main() {\n println(fetchDataSync())\n}\nOkHttp ist standardmäßig synchron, lässt sich aber leicht mit suspendCancellableCoroutine an Coroutines anpassen.
POST-Anfragen und Arbeit mit JSON
\nDas Senden von Daten ist die zweitwichtigste Operation. Betrachten wir, wie man JS