Ktor: vad är det, egenskaper hos den asynkrona HTTP-klienten

Författare: IT Sectr Publicerad: 2026-03-07 Lästid: 8 min

Ktor är en asynkron HTTP-klient för Kotlin, utvecklad av JetBrains som en del av ramverket med samma namn för server- och klientutveckling. Ktor är byggt på Kotlins korutiner och stöder flera plattformar. Enligt uppgifter från JetBrains, 2025 ger Ktor native integration med Kotlin-ekosystemet utan reflektion och extra beroenden.

Huvudpunkter

  • Ktor — asynkron HTTP-klient i Kotlin med stöd för flera plattformar
  • Korutiner — grunden för att utföra förfrågningar utan callbacks och reaktiva strömmar
  • Plugin-program — modulärt expansionssystem för serialisering, loggning och auktorisering
  • Multiplattform — en kod för Android, iOS, Desktop och Server
  • Kotlinx Serialization — native serialisering utan reflektion via @Serializable

Vad är Ktor?

Ktor är ett ramverk för att bygga asynkrona server- och klientapplikationer i Kotlin, skapat av JetBrains. Ktor Client — klientdelen av ramverket, som tillhandahåller en HTTP-klient med fullt stöd för Kotlins korutiner, multiplattform (JVM, Native, JS) och modulär arkitektur baserad på plugin-program.

Ktor dök upp 2018 som ett alternativ till Retrofit och OkHttp för Kotlin-first-projekt. Till skillnad från Retrofit, som portade Java-metoden med annotationer, använder Ktor Client Kotlin DSL för att konfigurera förfrågningar — utan annotationer och reflektion. Detta gör koden mer läsbar och typ-säker för Kotlin-utvecklare.

Enligt Kotlin Multiplatform-undersökningen 2024 används Ktor Client i 35% av Kotlin Multiplatform Mobile (KMM)-projekten, vilket gör det till den näst mest populära HTTP-klienten efter OkHttp i Kotlin-gemenskapen. Ktor föredras i projekt där multiplattform och native integration med Kotlin-ekosystemet är viktiga.

Hur fungerar Ktor Client

Arkitekturen för Ktor Client är baserad på en pipeline av plugin-program. Varje förfrågan går igenom en sekvens av installerade plugin-program som kan modifiera förfrågan, svaret eller utföra sidoåtgärder — loggning, komprimering, serialisering, autentisering.

När du skapar en HTTP-klient via HttpClient { } DSL-blocket anger du motorn (OkHttp, Android, CIO, Darwin) och installerar plugin-program. Varje motor implementerar lågnivå-sändning av förfrågningar för en specifik plattform: på Android används OkHttp-motorn, på iOS — Darwin (URLSession), på Desktop — CIO (Coroutine-based I/O). HttpClient väljer automatiskt den optimala motorn för den aktuella plattformen.

En förfrågan i Ktor Client utförs via en suspend-funktion, vilket innebär full integration med korutiner. Inga Callback, RxJava eller LiveData — bara sekventiell kod med suspend som fungerar asynkront utan att blockera tråden.

Pipeline för bearbetning av förfrågan

Ktor-pipelinen består av faser: först går förfrågan igenom de installerade plugin-programmen (t.ex. ContentNegotiation för JSON, Logging för loggar), sedan utför motorn HTTP-förfrågan, och svaret går igenom plugin-programmen igen för deserialisering. Varje plugin-program är en suspend-funktion som körs i pipelinens korutin.

En viktig fördel med Ktor-pipelinen är möjligheten till villkorlig bearbetning. Ett plugin-program kan kontrollera URL:en eller rubrikerna för förfrågan och hoppa över bearbetning om villkoret inte är uppfyllt. Till exempel tillämpas ContentEncoding med gzip endast på svar som innehåller rubriken Content-Encoding: gzip, och Auth aktiveras endast för skyddade endpoints utan att påverka offentliga API:er.

Denna pipeline-metod möjliggör flexibel kombination av plugin-program: du kan installera ContentNegotiation med JSON, lägga till Auth med Bearer-token, aktivera ContentEncoding-komprimering och HttpTimeout — och alla fungerar tillsammans i rätt ordning. Installationsordningen för plugin-program är viktig: det första installerade kommer att bearbeta förfrågan tidigare än de andra.

Ktor Client-plugin-program

Plugin-program — Ktors modulära expansionssystem som ersätter Retrofit-annotationer och OkHttp-interceptors. Varje plugin-program löser en specifik uppgift och installeras via funktionen install() i HttpClient-blocket. Ktor tillhandahåller inbyggda plugin-program och tillåter också att skapa anpassade.

PluginSyfte
ContentNegotiationSerialisering och deserialisering av JSON, XML via Kotlinx Serialization
LoggingLoggning av förfrågningar och svar med nivåkonfiguration
AuthAutentisering: Basic, Bearer, Digest med automatisk token-uppdatering
HttpTimeoutKonfiguration av timeout för anslutning, läsning och förfrågan
ContentEncodingTransparent gzip- och deflate-komprimering
DefaultRequestInställning av standardvärden för alla förfrågningar

Anpassade plugin-program

För specifika uppgifter skapas ett anpassat plugin-program via createClientPlugin. Plugin-programmet kan fånga upp förfrågan (onRequest), svaret (onResponse) eller hantera fel (onError). Detta ersätter helt Interceptor från OkHttp, men med typat Kotlin-API och stöd för suspend-funktioner.

Anpassade plugin-program är användbara för att lägga till mätvärden, automatisk omförsökslogik, spårning av förfrågningar eller A/B-testning av endpoints. Till skillnad från OkHttp-interceptors är Ktor-plugin-program skrivna i Kotlin och fungerar i korutinkontext, vilket förenklar fel- och timeout-hantering.

För felsökning av förfrågningar används plugin-programmet Logging med nivån ALL, HEADERS eller BODY. Logging visar metoden, URL:en, status, rubriker och kroppen för förfrågan och svaret. Till skillnad från HttpLoggingInterceptor från OkHttp fungerar Ktor Logging asynkront och kan konfigureras för filtrering efter loggnivå (ERROR, WARN, INFO, DEBUG) utan att stoppa applikationen för konfigurationsändring.

Kodexempel för Ktor Client i Kotlin

Låt oss titta på en grundläggande GET-förfrågan via Ktor Client. En HttpClient skapas med installerat plugin-program ContentNegotiation för JSON. Förfrågan utförs via suspend-funktionen get(), resultatet deserialiseras automatiskt till en data class.

kotlin
data class User(
    val login: String,
    val id: Int,
    val avatarUrl: String
)

val client = HttpClient {
    install(ContentNegotiation) {
        json(Json {
            ignoreUnknownKeys = true
        })
    }
}

suspend fun getUser(): User {
    return client.get("https://api.github.com/users/octocat").body()
}

För en POST-förfrågan med kropp används funktionen post() med contentType() och body(). Ktor serialiserar automatiskt objektet till JSON via den installerade ContentNegotiation. DSL-stilen gör koden sekventiell och läsbar.

kotlin
data class CreateRepo(
    val name: String,
    val description: String,
    val private: Boolean
)

suspend fun createRepo(): Unit {
    val repo = CreateRepo(
        name = "my-project",
        description = "Sample project",
        private = false
    )
    client.post("https://api.github.com/user/repos") {
        contentType(ContentType.Application.Json)
        setBody(repo)
    }
}

Konfiguration av timeout och rubriker

HttpTimeout och DefaultRequest — två viktiga plugin-program för konfiguration. HttpTimeout ställer in tidsgränser och DefaultRequest anger rubriker och URL-parametrar för alla förfrågningar, vilket eliminerar kodduplicering i varje anrop.

kotlin
val client = HttpClient {
    install(HttpTimeout) {
        connectTimeoutMillis = 15000
        requestTimeoutMillis = 30000
    }
    install(DefaultRequest) {
        url("https://api.github.com/")
        header("Accept", "application/json")
    }
}

Ktors multiplattformsstöd

Multiplattform — den främsta fördelen med Ktor jämfört med OkHttp och Retrofit. Ktor Client fungerar på JVM (Android, Server), Native (iOS, macOS, Windows, Linux) och JS (Browser). Samma HTTP-klientkod körs på alla plattformar utan ändringar, vilket är särskilt värdefullt för Kotlin Multiplatform-projekt.

För varje plattform använder Ktor sin egen motor. På Android används som standard OkHttp-motorn, som ger full kompatibilitet med OkHttp-ekosystemet. På iOS används DarwinEngine baserad på URLSession. För Server — CIOEngine (Coroutine I/O). Motorn kan anges explicit: HttpClient(OkHttp) { } eller HttpClient(Darwin) { }.

När du väljer motor, överväg dess kapacitet: OkHttp-motorn stöder HTTP/2 och anslutningspool, DarwinEngine — native integration med iOS-nätverket och URLSession-bakgrundssessioner, CIOEngine — ren korutinimplementering utan externa beroenden. För Web-mål används JsEngine eller BrowserEngine som fungerar via fetch API.

Tack vare det enhetliga API:et på alla plattformar ser koden för dataladdning likadan ut på Android, iOS och Desktop. Detta minskar kodduplicering med 60–80% i KMM-projekt jämfört med separata implementeringar på Retrofit (Android) och URLSession (iOS). Plugin-program fungerar också på alla plattformar utan ändringar.

Vanliga misstag vid arbete med Ktor

Att ignorera stängning av HttpClient — ett vanligt misstag i Ktor. HttpClient implementerar Closeable och måste stängas när applikationen avslutas via client.close(). I Android görs detta i onDestroy() för Activity eller ViewModel.onCleared(). En ostängd klient leder till läckage av korutiner och motortrådar.

Felaktig ordning på plugin-program kan störa bearbetningen av förfrågan. Till exempel måste ContentNegotiation installeras före DefaultRequest för att innehållstypen ska tillämpas korrekt. Logging rekommenderas att installeras sist för att logga den slutliga versionen av förfrågan efter alla ändringar. Experimentera med ordningen om plugin-program beter sig oväntat.

Brist på undantagshantering i suspend-funktioner. Ktor kastar IOException vid nätverksfel och ClientRequestException vid HTTP-status 4xx. Ett try-catch-block är obligatoriskt för varje anrop av get(), post() och andra metoder. Använd HttpResponseValidator i HttpClient-blocket för global felhantering utan att duplicera try-catch i varje metod.

Vanliga frågor

Hur skiljer sig Ktor från Retrofit?

Ktor använder Kotlin DSL och plugin-program utan annotationer och reflektion. Retrofit är byggt på Java-annotationer och reflektion. Ktor stöder multiplattform, Retrofit — endast JVM/Android. Ktor fungerar native med korutiner, Retrofit lade till suspend via en wrapper.

Vilken Ktor-motor är bäst för Android?

För Android är OkHttp-motorn optimal — den ger kompatibilitet med OkHttp-ekosystemet, anslutningspool, cachning och HTTP/2. Välj den via HttpClient(OkHttp) { }. Alternativ — CIOEngine inbyggd i Ktor, men den är mindre stabil på Android.

Stöder Ktor HTTP/2?

Ja, Ktor stöder HTTP/2 via motsvarande motor. OkHttp-motorn ärver HTTP/2-stöd från OkHttp. DarwinEngine på iOS stöder HTTP/2 via URLSession. CIOEngine stöder HTTP/2 på serversidan. Valet av motor bestämmer protokollstödsnivån.

Hur konfigurerar jag auktorisering i Ktor Client?

Använd plugin-programmet Auth med inställningen bearer { }. Plugin-programmet lägger automatiskt till Authorization-rubriken till varje förfrågan och kan uppdatera token vid 401-svar via refreshTokens. Exempel: install(Auth) { bearer { loadTokens { BearerTokens(token, refreshToken) } } }.

Kan Ktor Client användas på iOS?

Ja, Ktor Client fungerar fullt ut på iOS via DarwinEngine, som använder URLSession. Alla plugin-program, serialisering och korutiner fungerar på iOS precis som på Android. Detta gör Ktor till den primära HTTP-klienten för Kotlin Multiplatform Mobile (KMM)-projekt.

Sammanfattning

  • Ktor — asynkron HTTP-klient från JetBrains med multiplattformsstöd
  • Kotlin DSL ersätter annotationer — konfiguration via programmatiska block utan reflektion
  • Plugin-program ContentNegotiation, Auth, Logging och HttpTimeout utökar funktionaliteten modulärt
  • Korutiner — grunden för exekvering: alla metoder är suspend utan callbacks och reaktiva strömmar
  • Multiplattform — en kod för Android, iOS, Desktop, Server och JS
  • Motorer OkHttp, Darwin, CIO anpassar Ktor till specifik plattform
  • HttpResponseValidator centraliserar HTTP-felhantering utan try-catch-duplicering

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också