Ktor Kotlin के लिए एक एसिंक्रोनस HTTP क्लाइंट और सर्वर फ्रेमवर्क है जो मल्टीप्लेटफ़ॉर्म डेवलपमेंट का समर्थन करता है। लाइब्रेरी Kotlin कोरूटीन पर बनी है और JVM, iOS, Android, JS और Native पर काम करती है। GitHub पर Ktor रिपॉजिटरी के अनुसार, परियोजना JetBrains टीम द्वारा सक्रिय रूप से विकसित की जा रही है। Ktor HTTP कनेक्शन के लचीले कॉन्फ़िगरेशन के लिए प्लगइन सिस्टम के साथ एक मॉड्यूलर आर्किटेक्चर प्रदान करता है।
मुख्य बिंदु
Ktor Kotlin में HTTP क्लाइंट और सर्वर बनाने के लिए JetBrains द्वारा विकसित एक फ्रेमवर्क है। पारंपरिक लाइब्रेरीज़ के विपरीत, Ktor को शुरू से ही मल्टीप्लेटफ़ॉर्म डेवलपमेंट के लिए डिज़ाइन किया गया था और यह Kotlin द्वारा समर्थित सभी प्लेटफ़ॉर्म पर काम करता है।
Ktor मिडलवेयर हैंडलर दृष्टिकोण का उपयोग करता है, जो Kodein और Express.js की आर्किटेक्चर से प्रेरित है। प्रत्येक अनुरोध हैंडलर फ़ंक्शन की पाइपलाइन से गुज़रता है जो अनुरोध और प्रतिक्रिया को संशोधित कर सकते हैं। यह एनोटेशन-आधारित सख्त आर्किटेक्चर वाली लाइब्रेरीज़ में उपलब्ध नहीं होने वाली लचीलापन प्रदान करता है।
वर्तमान संस्करण Ktor 3.0 में Kotlin 2.0, K2 कंपाइलर और बेहतर प्रदर्शन के साथ नए CIO (Coroutine I/O) इंजन के लिए समर्थन शामिल है। लाइब्रेरी Apache 2.0 लाइसेंस के तहत वितरित की जाती है और बिना किसी प्रतिबंध के व्यावसायिक उपयोग के लिए उपलब्ध है।
Ktor का क्लाइंट भाग पूरी तरह से Kotlin कोरूटीन पर बना है, जो थ्रेड ब्लॉकिंग के बिना कुशल एसिंक्रोनस अनुरोध निष्पादन प्रदान करता है। सर्वर भाग रूटिंग, अनुरोध प्रसंस्करण और WebSocket कनेक्शन के साथ HTTP सर्वर बनाने की अनुमति देता है।
Ktor प्लगइन आर्किटेक्चर का उपयोग करता है: सभी अतिरिक्त सुविधाएँ — लॉगिंग, सीरियलाइज़ेशन, प्रमाणीकरण — प्लगइन के माध्यम से जुड़ती हैं। यह लाइब्रेरी को मॉड्यूलर बनाता है और केवल आवश्यक घटकों को जोड़ने की अनुमति देता है, जिससे अंतिम एप्लिकेशन का आकार कम होता है।
सभी प्लेटफ़ॉर्म पर एकीकृत API के लिए धन्यवाद, डेवलपर को iOS और Android के लिए अलग-अलग HTTP क्लाइंट सीखने की ज़रूरत नहीं है। मल्टीप्लेटफ़ॉर्म परियोजना में, नेटवर्क लेयर का कोड पूरी तरह से साझा होता है, और प्लेटफ़ॉर्म-विशिष्ट कार्यान्वयन HttpClient इंजन के पीछे छिपा होता है। इससे डेवलपमेंट का समय कम होता है और प्लेटफ़ॉर्म अंतर से संबंधित त्रुटियों की संख्या घटती है।
Ktor सुविधाओं का एक सेट प्रदान करता है जो इसे आधुनिक Kotlin परियोजनाओं, विशेष रूप से मल्टीप्लेटफ़ॉर्म वाली, के लिए एक आकर्षक विकल्प बनाता है।
Ktor JVM, Android, iOS, macOS, Windows, Linux, JavaScript और Wasm पर काम करता है। वही HTTP क्लाइंट कोड बिना बदलाव के सभी प्लेटफ़ॉर्म पर चलता है। यह OkHttp या URLSession से जुड़ी लाइब्रेरीज़ पर एक मुख्य लाभ है।
Kotlin में कोरूटीन कॉलबैक के बिना प्राकृतिक एसिंक्रोनसी प्रदान करते हैं। प्रत्येक अनुरोध एक suspend फ़ंक्शन है जिसे किसी भी कोरूटीन से कॉल किया जा सकता है। Ktor Flow के माध्यम से प्रतिक्रिया स्ट्रीमिंग का समर्थन करता है, जो लंबे कनेक्शन और WebSocket के लिए सुविधाजनक है।
Ktor प्लगइन install ब्लॉक के माध्यम से जुड़ते हैं और अलग से कॉन्फ़िगर किए जाते हैं। मुख्य प्लगइन: सीरियलाइज़ेशन के लिए ContentNegotiation, लॉगिंग के लिए Logging, प्रमाणीकरण के लिए Auth और द्विदिश संचार के लिए WebSockets। प्रत्येक प्लगइन को स्वतंत्र रूप से सक्षम या अक्षम किया जा सकता है।
त्रुटि प्रबंधन Ktor में अपवादों पर आधारित है। ClientRequestException क्लास 4xx कोड के लिए, ServerResponseException 5xx के लिए और IOException नेटवर्क विफलताओं के लिए फेंका जाता है। टाइमआउट HttpTimeout प्लगइन के माध्यम से कॉन्फ़िगर किए जाते हैं, जो कनेक्शन, पढ़ने और लिखने के लिए प्रतीक्षा समय निर्धारित करता है। पुनः प्रयास के लिए Retry प्लगइन का उपयोग प्रयासों की संख्या और देरी की सेटिंग्स के साथ किया जाता है।
Ktor पाइपलाइन आर्किटेक्चर का उपयोग करता है जहाँ प्रत्येक अनुरोध हैंडलर की श्रृंखला से गुज़रता है। क्लाइंट स्थापित प्लगइन के साथ HttpClient कॉन्फ़िगरेशन बनाता है, और get या post का प्रत्येक कॉल प्लगइन के माध्यम से उनके कनेक्शन क्रम में गुज़रता है।
HttpClient ऑब्जेक्ट प्लेटफ़ॉर्म-विशिष्ट इंजन के साथ बनाया जाता है: JVM और Android के लिए CIO, iOS और macOS के लिए Darwin, Android संगतता के लिए OkHttp, ब्राउज़र के लिए Js। इंजन को स्पष्ट रूप से चुना जा सकता है या स्वचालित चयन पर छोड़ा जा सकता है। प्रत्येक अनुरोध HttpResponse लौटाता है जिसमें प्रतिक्रिया का मुख्य भाग, हेडर और स्थिति होती है।
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 की स्थापना Gradle या Maven के माध्यम से की जाती है। मल्टीप्लेटफ़ॉर्म परियोजनाओं के लिए, निर्भरताएँ प्रत्येक लक्ष्य के लिए sourceSets में निर्दिष्ट की जाती हैं। Ktor Maven Central के माध्यम से वितरित किया जाता है।
build.gradle.kts में, सामान्य कोड के लिए ktor-client-core निर्भरता और विशिष्ट प्लेटफ़ॉर्म के लिए एक इंजन जोड़ें। Ktor संस्करण gradle.properties में एक चर के माध्यम से सेट किया जाता है। Ktor 3.x को Kotlin 2.0+ की आवश्यकता है और यह K2 कंपाइलर का समर्थन करता है।
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 के लिए, Darwin इंजन का उपयोग किया जाता है जो मूल URLSession को रैप करता है। Kotlin Multiplatform में, यह अधिकतम प्रदर्शन और iOS सिस्टम कैशिंग तंत्र के साथ एकीकरण प्रदान करता है। इंजन iOS sourceSet में एक अलग निर्भरता के रूप में जोड़ा जाता है।
Ktor की एक महत्वपूर्ण विशेषता ContentNegotiation के माध्यम से विभिन्न सीरियलाइज़ेशन प्रारूपों का समर्थन है। JSON के अलावा, प्लगइन Protobuf, CBOR, XML और कस्टम प्रारूपों का समर्थन करता है। सीरियलाइज़ेशन के लिए kotlinx.serialization या Jackson लाइब्रेरी का उपयोग किया जाता है, और डेवलपर अनुरोध कोड को बदले बिना उनके बीच स्विच कर सकता है।
नीचे दिए गए उदाहरण Ktor क्लाइंट के साथ काम करने के विशिष्ट परिदृश्य दिखाते हैं: बुनियादी GET अनुरोध, डेटा भेजना और मल्टीप्लेटफ़ॉर्म कोड के साथ कार्य करना।
एक सरल GET अनुरोध जिसमें डेटा क्लास में प्रतिक्रिया का स्वचालित डीसीरियलाइज़ेशन होता है। Ktor JSON को ऑब्जेक्ट में बदलने के लिए kotlinx.serialization के साथ ContentNegotiation प्लगइन का उपयोग करता है। कोड संक्षिप्त और टाइप-सेफ होता है।
@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()
}
POST अनुरोध Ktor में डेटा क्लास को JSON बॉडी के रूप में post विधि के माध्यम से contentType और setBody के साथ भेजता है। ContentNegotiation प्लगइन स्वचालित रूप से ऑब्जेक्ट को JSON स्ट्रिंग में सीरियलाइज़ करता है। प्रतिक्रिया को सिंक्रोनस या एसिंक्रोनस रूप से संसाधित किया जा सकता है।
suspend fun createPost(): Post {
val newPost = Post(
id = 0,
title = "नई पोस्ट",
body = "पोस्ट सामग्री"
)
val response = client.post("https://jsonplaceholder.typicode.com/posts") {
contentType(ContentType.Application.Json)
setBody(newPost)
}
return response.body()
}
Ktor में submitFormWithBinaryData विधि फ़ाइलों और फ़ॉर्म को multipart प्रारूप में भेजने की अनुमति देती है। Ktor स्वचालित रूप से डेटा को भागों में विभाजित करता है और हेडर जोड़ता है। प्रगति को ट्रैक करने के लिए onUpload का उपयोग किया जाता है, जो भेजे गए डेटा के बाइट प्राप्त करता है।
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\"")
})
}
)
}
चुनाव Ktor और Retrofit के बीच परियोजना की आर्किटेक्चर और मल्टीप्लेटफ़ॉर्म आवश्यकताओं पर निर्भर करता है। Retrofit केवल Android परियोजनाओं के लिए मानक बना हुआ है, जबकि Ktor Kotlin Multiplatform के लिए सबसे अच्छा विकल्प है।
Ktor WebSocket और SSE (Server-Sent Events) के लिए अंतर्निहित समर्थन भी प्रदान करता है, जो इसे रीयल-टाइम एप्लिकेशन के लिए सुविधाजनक बनाता है। Retrofit सीधे WebSocket का समर्थन नहीं करता — इसके लिए अलग OkHttp WebSocket लाइब्रेरी की आवश्यकता होती है। Ktor अपने प्लगइन सिस्टम के कारण विभिन्न वातावरणों के लिए कॉन्फ़िगर करना भी आसान है, जहाँ प्रत्येक प्लगइन एक फ़ंक्शन के लिए जिम्मेदार है।
Ktor में Auth प्लगइन बुनियादी प्रमाणीकरण, Bearer टोकन, Digest और OAuth2 का समर्थन करता है। प्रमाणीकरण कॉन्फ़िगरेशन घोषणात्मक रूप से किया जाता है: डेवलपर प्रदाता, टोकन स्रोत और दायरा निर्दिष्ट करता है। Ktor स्वचालित रूप से अनुरोधों में प्रमाणीकरण हेडर जोड़ता है और टोकन समाप्त होने पर उसे रिफ्रेश कर सकता है।
यदि कोई परियोजना iOS और Android पर साझा कोड के साथ Kotlin Multiplatform का उपयोग करती है, तो Ktor एकमात्र विकल्प है जो अतिरिक्त परतों के बिना दोनों प्लेटफ़ॉर्म पर काम करता है। Retrofit OkHttp और JVM से कसकर जुड़ा है, जो इसे iOS के लिए अनुपयुक्त बनाता है।
केवल Android परियोजनाओं के लिए, Retrofit अधिक परिपक्व API, अधिक संख्या में कन्वर्टर और OkHttp इंटरसेप्टर प्रदान करता है। Ktor इस परिदृश्य में भी काम करता है, लेकिन इसका प्लगइन इकोसिस्टम कम व्यापक है। दोनों लाइब्रेरी कोरूटीन का समर्थन करती हैं और तुलनीय प्रदर्शन देती हैं।
| मापदंड | Ktor | Retrofit |
|---|---|---|
| मल्टीप्लेटफ़ॉर्म | iOS, Android, JVM, JS, Native | केवल JVM और Android |
| HTTP इंजन | CIO, Darwin, OkHttp, Js | OkHttp |
| कन्वर्टर | kotlinx.serialization, Jackson | Gson, Moshi, Jackson, Protobuf |
| आर्किटेक्चर | प्लगइन के साथ पाइपलाइन | कोड जनरेशन के साथ एनोटेशन |
| डेवलपर | JetBrains | Square |
अक्सर पूछे जाने वाले प्रश्न
Ktor — JetBrains का कोरूटीन पर मल्टीप्लेटफ़ॉर्म HTTP क्लाइंट। Retrofit — OkHttp पर आधारित Square की Android लाइब्रेरी। Ktor iOS, Android, JS और Native पर काम करता है, जबकि Retrofit केवल JVM पर काम करता है।
हाँ, Ktor Darwin इंजन के माध्यम से iOS का समर्थन करता है जो मूल URLSession का उपयोग करता है। यह अधिकतम प्रदर्शन और iOS सिस्टम कैश के साथ सही संचालन सुनिश्चित करता है। क्लाइंट कोड प्लेटफ़ॉर्म के बीच साझा रहता है।
Ktor इंजनों का समर्थन करता है: CIO (JVM/Android), Darwin (iOS/macOS), OkHttp (Android), Js (ब्राउज़र), Jetty, Netty, Tomcat (सर्वर)। इंजन को स्पष्ट रूप से चुना जा सकता है या डिफ़ॉल्ट स्वचालित चयन पर छोड़ा जा सकता है।
हाँ, Ktor के पास क्लाइंट और सर्वर दोनों पर अंतर्निहित WebSocket समर्थन है। क्लाइंट के लिए WebSockets प्लगइन का उपयोग किया जाता है, जो द्विदिश कनेक्शन स्थापित करने और रीयल-टाइम में संदेशों का आदान-प्रदान करने की अनुमति देता है।
त्रुटियाँ suspend कॉल के आसपास try-catch के माध्यम से संभाली जाती हैं। Ktor 4xx के लिए ClientRequestException, 5xx के लिए ServerResponseException और नेटवर्क त्रुटियों के लिए IOException फेंकता है। एकीकरण के लिए Result प्रकार का उपयोग करने की अनुशंसा की जाती है।
निष्कर्ष
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें