HTTP-Client in Kotlin: Anfragen richtig stellen
Moderne Entwicklung für Android und Backend-Dienste in Kotlin kommt selten ohne Interaktion mit entfernten APIs aus. Die Erstellung eines zuverlässigen HTTP-Clients ist eine grundlegende Aufgabe, von deren korrekter Lösung die Stabilität der gesamten Anwendung abhängt. In diesem Artikel werden wir uns ansehen, wie man HTTP-Anfragen in Kotlin mit den beiden beliebtesten Bibliotheken durchführt: Ktor Client und OkHttp. Sie erfahren, wie Sie GET- und POST-Anfragen senden, JSON verarbeiten, Fehler verwalten und sauberen, wartbaren Code schreiben.
Warum Ktor Client die Wahl des modernen Kotlin-Entwicklers ist
Ktor Client ist ein asynchroner HTTP-Client, der speziell für Kotlin vom JetBrains-Team entwickelt wurde. Er unterstützt vollständig Coroutines, was den Code prägnant und sicher macht. Im Gegensatz zu OkHttp ist Ktor von Grund auf für Multiplattform-Fähigkeiten konzipiert: Derselbe Code funktioniert auf Android, iOS, JVM, JS und Native.
Abhängigkeiten installieren
Fügen Sie für die Arbeit mit Ktor Client die folgenden Abhängigkeiten in Ihre Datei build.gradle.kts ein:
dependencies { // Basis-Client implementation("io.ktor:ktor-client-core:2.3.7") // Engine für JVM (OkHttp oder CIO) implementation("io.ktor:ktor-client-okhttp:2.3.7") // Für JSON-Serialisierung 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")}Einfache GET-Anfrage
Erstellen wir einen HTTP-Client und führen eine GET-Anfrage an eine Test-API (JSONPlaceholder) durch:
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 { // Basis-Konfiguration engine { // Einstellungen für die OkHttp-Engine } } val response: HttpResponse = client.get("https://jsonplaceholder.typicode.com/users/$userId") return response.bodyAsText()}
fun main() = runBlocking { val userData = fetchUser(1) println(userData)}Beachten Sie: fetchUser ist eine suspend-Funktion. Dies ermöglicht es, sie aus einer Coroutine heraus aufzurufen, ohne den Thread zu blockieren.
POST-Anfrage mit JSON-Body
Um Daten im JSON-Format zu senden, binden wir das Plugin ContentNegotiation ein und definieren eine data-Klasse:
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 = "Funktioniert einwandfrei!") val createdPost = createPost(newPost) println(createdPost)}Der entscheidende Punkt: Das Plugin ContentNegotiation serialisiert das Objekt automatisch in JSON und deserialisiert die Antwort zurück in die data-Klasse.
OkHttp — der bewährte Standard für Android
OkHttp bleibt der De-facto-Standard für Netzwerkanfragen in der Android-Entwicklung. Es ist schnell, zuverlässig und unterstützt P