Ktor, çoklu platform geliştirmeyi destekleyen Kotlin için async bir HTTP istemcisi ve sunucu framework'üdür. Kütüphane Kotlin coroutines üzerine inşa edilmiştir ve JVM, iOS, Android, JS ve Native üzerinde çalışır. GitHub'daki Ktor deposuna göre, proje aktif olarak JetBrains ekibi tarafından geliştirilmektedir. Ktor, HTTP bağlantılarının esnek yapılandırması için eklenti sistemiyle modüler bir mimari sunar.
Önemli noktalar
Ktor, JetBrains tarafından geliştirilen Kotlin'de HTTP istemcileri ve sunucuları oluşturmak için bir framework'tür. Geleneksel kütüphanelerin aksine, Ktor en başından itibaren çoklu platform geliştirme için tasarlanmıştır ve Kotlin tarafından desteklenen tüm platformlarda çalışır.
Ktor, Kodein ve Express.js mimarisinden ilham alan bir middleware işleyici yaklaşımı kullanır. Her istek, isteği ve yanıtı değiştirebilen işleyici işlevlerinden oluşan bir pipeline'dan geçer. Bu, katı açıklama tabanlı mimariye sahip kütüphanelerde bulunmayan esneklik sağlar.
Mevcut sürüm Ktor 3.0, Kotlin 2.0, K2 derleyicisi ve geliştirilmiş performansa sahip yeni CIO (Coroutine I/O) motoru için destek içerir. Kütüphane Apache 2.0 lisansı altında dağıtılır ve kısıtlama olmaksızın ticari kullanım için mevcuttur.
Ktor'un istemci tarafı tamamen Kotlin coroutines üzerine inşa edilmiştir ve iş parçacığı engellemesi olmadan verimli async istek yürütme sağlar. Sunucu tarafı, yönlendirme, istek işleme ve WebSocket bağlantılarıyla HTTP sunucuları oluşturmaya olanak tanır.
Ktor bir eklenti mimarisi kullanır: tüm ek özellikler — loglama, serileştirme, kimlik doğrulama — eklentiler aracılığıyla bağlanır. Bu, kütüphaneyi modüler hale getirir ve yalnızca gerekli bileşenlerin bağlanmasına izin vererek son uygulama boyutunu küçültür.
Tüm platformlarda birleşik API sayesinde, geliştiricinin iOS ve Android için farklı HTTP istemcileri öğrenmesi gerekmez. Çoklu platform projesinde, ağ katmanı kodu tamamen paylaşılır ve platforma özgü uygulama HttpClient motorunun arkasında gizlenir. Bu, geliştirme süresini kısaltır ve platform farklılıklarıyla ilgili hata sayısını azaltır.
Ktor, onu modern Kotlin projeleri, özellikle çoklu platform projeleri için cazip bir seçim haline getiren bir dizi özellik sunar.
Ktor, JVM, Android, iOS, macOS, Windows, Linux, JavaScript ve Wasm üzerinde çalışır. Aynı HTTP istemci kodu değişiklik yapılmadan tüm platformlarda çalışır. Bu, OkHttp veya URLSession'a bağlı kütüphanelere göre önemli bir avantajdır.
Kotlin'deki coroutines, geri aramalar olmadan doğal asenkronluk sağlar. Her istek, herhangi bir coroutine'den çağrılabilen bir suspend işlevidir. Ktor, uzun bağlantılar ve WebSocket için uygun olan Flow aracılığıyla yanıt akışını destekler.
Ktor eklentileri bir install bloğu aracılığıyla bağlanır ve ayrı ayrı yapılandırılır. Ana eklentiler: serileştirme için ContentNegotiation, loglama için Logging, kimlik doğrulama için Auth ve çift yönlü iletişim için WebSockets. Her eklenti bağımsız olarak etkinleştirilebilir veya devre dışı bırakılabilir.
Ktor'da hata işleme istisnalara dayanır. ClientRequestException sınıfı 4xx kodları için, ServerResponseException 5xx için ve IOException ağ hataları için fırlatılır. Zaman aşımları, bağlantı, okuma ve yazma için bekleme süresini ayarlayan HttpTimeout eklentisi aracılığıyla yapılandırılır. Yeniden denemeler için, deneme sayısı ve gecikme ayarlarıyla Retry eklentisi kullanılır.
Ktor, her isteğin bir işleyici zincirinden geçtiği pipeline mimarisini kullanır. İstemci, yüklenmiş eklentilerle bir HttpClient yapılandırması oluşturur ve get veya post çağrılarının her biri, bağlanma sırasına göre eklentilerden geçer.
HttpClient nesnesi, platforma özgü bir motorla oluşturulur: JVM ve Android için CIO, iOS ve macOS için Darwin, Android uyumluluğu için OkHttp, tarayıcı için Js. Motor açıkça seçilebilir veya otomatik seçime bırakılabilir. Her istek, yanıt gövdesini, başlıkları ve durumu içeren bir HttpResponse döndürür.
val client = HttpClient(CIO) {
install(ContentNegotiation) {
json(Json {
ignoreUnknownKeys = true
})
}
}
suspend fun fetchUsers(): List<User> {
return client.get("https://api.example.com/users").body()
}
Ktor kurulumu Gradle veya Maven aracılığıyla yapılır. Çoklu platform projeleri için bağımlılıklar her hedef için sourceSets içinde belirtilir. Ktor, Maven Central aracılığıyla dağıtılır.
build.gradle.kts dosyasına, ortak kod için ktor-client-core bağımlılığını ve belirli platform için bir motor ekleyin. Ktor sürümü, gradle.properties içindeki bir değişken aracılığıyla ayarlanır. Ktor 3.x, Kotlin 2.0+ gerektirir ve K2 derleyicisini destekler.
val ktorVersion = "3.0.3"
dependencies {
implementation("io.ktor:ktor-client-core:$ktorVersion")
implementation("io.ktor:ktor-client-cio:$ktorVersion")
implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion")
implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion")
implementation("io.ktor:ktor-client-logging:$ktorVersion")
}
iOS için, yerel URLSession'ı sarmalayan Darwin motoru kullanılır. Kotlin Multiplatform'da bu, maksimum performans ve iOS sistem önbellekleme mekanizmalarıyla entegrasyon sağlar. Motor, iOS sourceSet'inde ayrı bir bağımlılık olarak eklenir.
Ktor'un önemli bir özelliği, ContentNegotiation aracılığıyla farklı serileştirme biçimlerini desteklemesidir. JSON'a ek olarak, eklenti Protobuf, CBOR, XML ve özel biçimleri destekler. Serileştirme için kotlinx.serialization veya Jackson kütüphaneleri kullanılır ve geliştirici istek kodunu değiştirmeden bunlar arasında geçiş yapabilir.
Aşağıdaki örnekler, Ktor istemcisiyle çalışmanın tipik senaryolarını gösterir: temel GET isteği, veri gönderme ve çoklu platform koduyla çalışma.
Yanıtın bir data class'a otomatik olarak deserileştirildiği basit bir GET isteği. Ktor, JSON'u nesnelere dönüştürmek için kotlinx.serialization ile ContentNegotiation eklentisini kullanır. Kod kısa ve tür güvenlidir.
@Serializable
data class Post(
val id: Int,
val title: String,
val body: String
)
suspend fun getPosts(): List<Post> {
val response = client.get("https://jsonplaceholder.typicode.com/posts")
return response.body()
}
Ktor'da POST isteği, contentType ve setBody ile post yöntemi aracılığıyla bir data class'ı JSON gövdesi olarak gönderir. ContentNegotiation eklentisi nesneyi otomatik olarak bir JSON dizesine serileştirir. Yanıt eşzamanlı veya eşzamansız olarak işlenebilir.
suspend fun createPost(): Post {
val newPost = Post(
id = 0,
title = "Yeni gönderi",
body = "Gönderi içeriği"
)
val response = client.post("https://jsonplaceholder.typicode.com/posts") {
contentType(ContentType.Application.Json)
setBody(newPost)
}
return response.body()
}
Ktor'daki submitFormWithBinaryData yöntemi, multipart biçiminde dosya ve form göndermeye olanak tanır. Ktor verileri otomatik olarak parçalara ayırır ve başlıklar ekler. İlerlemeyi izlemek için, gönderilen verilerin baytlarını alan onUpload kullanılır.
suspend fun uploadFile(fileBytes: ByteArray) {
client.submitFormWithBinaryData(
url = "https://api.example.com/upload",
formData = formData {
append("file", fileBytes, Headers.build {
append(HttpHeaders.ContentType, "image/png")
append(HttpHeaders.ContentDisposition, "filename=\"photo.png\"")
})
}
)
}
Seçim, proje mimarisine ve çoklu platform gereksinimlerine bağlıdır. Retrofit, yalnızca Android projeleri için standart olmaya devam ederken, Ktor Kotlin Multiplatform için en iyi seçimdir.
Ktor ayrıca WebSocket ve SSE (Server-Sent Events) için yerleşik destek sağlayarak onu gerçek zamanlı uygulamalar için uygun hale getirir. Retrofit, WebSocket'i doğrudan desteklemez — bunun için ayrı bir OkHttp WebSocket kütüphanesi gerekir. Ktor, her eklentinin bir işlevden sorumlu olduğu eklenti sistemi sayesinde farklı ortamlar için yapılandırması da daha kolaydır.
Ktor'daki Auth eklentisi, temel kimlik doğrulama, Bearer tokenları, Digest ve OAuth2'yi destekler. Kimlik doğrulama yapılandırması bildirimsel olarak yapılır: geliştirici sağlayıcıyı, token kaynağını ve kapsamı belirtir. Ktor, isteklere otomatik olarak kimlik doğrulama başlıkları ekler ve token süresi dolduğunda yenileyebilir.
Bir proje iOS ve Android'de paylaşılan kodla Kotlin Multiplatform kullanıyorsa, Ktor ek katmanlar olmadan her iki platformda da çalışan tek seçenektir. Retrofit, OkHttp ve JVM'ye sıkı sıkıya bağlıdır ve bu da onu iOS için uygunsuz hale getirir.
Yalnızca Android projeleri için Retrofit daha olgun bir API, daha fazla sayıda dönüştürücü ve OkHttp interceptoru sağlar. Ktor bu senaryoda da çalışır, ancak eklenti ekosistemi daha az kapsamlıdır. Her iki kütüphane de coroutines'i destekler ve karşılaştırılabilir performans sunar.
| Kriter | Ktor | Retrofit |
|---|---|---|
| Çoklu platform | iOS, Android, JVM, JS, Native | Yalnızca JVM ve Android |
| HTTP motoru | CIO, Darwin, OkHttp, Js | OkHttp |
| Dönüştürücüler | kotlinx.serialization, Jackson | Gson, Moshi, Jackson, Protobuf |
| Mimari | Eklentilerle pipeline | Kod oluşturmayla açıklamalar |
| Geliştirici | JetBrains | Square |
Sık sorulan sorular
Ktor — JetBrains'in coroutines üzerinde çoklu platform HTTP istemcisi. Retrofit — OkHttp tabanlı Square'in Android kütüphanesi. Ktor iOS, Android, JS ve Native'de çalışırken, Retrofit yalnızca JVM'de çalışır.
Evet, Ktor, yerel URLSession'ı kullanan Darwin motoru aracılığıyla iOS'u destekler. Bu, maksimum performans ve iOS sistem önbelleğiyle doğru çalışma sağlar. İstemci kodu platformlar arasında paylaşılır.
Ktor şu motorları destekler: CIO (JVM/Android), Darwin (iOS/macOS), OkHttp (Android), Js (tarayıcı), Jetty, Netty, Tomcat (sunucu). Motor açıkça seçilebilir veya varsayılan otomatik seçime bırakılabilir.
Evet, Ktor hem istemci hem de sunucu taraflarında yerleşik WebSocket desteğine sahiptir. İstemci için, çift yönlü bağlantı kurmaya ve gerçek zamanlı mesaj alışverişine olanak tanıyan WebSockets eklentisi kullanılır.
Hatalar, suspend çağrıları etrafında try-catch ile işlenir. Ktor, 4xx için ClientRequestException, 5xx için ServerResponseException ve ağ hataları için IOException fırlatır. Birleştirme için Result türünün kullanılması önerilir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun