Ktor Kotlin के लिए एक एसिंक्रोनस HTTP क्लाइंट है, जिसे JetBrains द्वारा सर्वर और क्लाइंट डेवलपमेंट के लिए इसी नाम के फ्रेमवर्क के हिस्से के रूप में विकसित किया गया है। Ktor Kotlin कोरूटीन पर बनाया गया है और मल्टीप्लेटफ़ॉर्म का समर्थन करता है। JetBrains, 2025 के अनुसार, Ktor बिना रिफ्लेक्शन और अतिरिक्त निर्भरताओं के Kotlin इकोसिस्टम के साथ मूल एकीकरण प्रदान करता है।
मुख्य बिंदु
Ktor JetBrains द्वारा बनाया गया Kotlin में एसिंक्रोनस सर्वर और क्लाइंट एप्लिकेशन बनाने के लिए एक फ्रेमवर्क है। Ktor Client फ्रेमवर्क का क्लाइंट-साइड भाग है, जो Kotlin कोरूटीन, मल्टीप्लेटफ़ॉर्म (JVM, Native, JS) और मॉड्यूलर प्लगइन-आधारित आर्किटेक्चर के पूर्ण समर्थन के साथ HTTP क्लाइंट प्रदान करता है।
Ktor 2018 में Kotlin-प्रथम परियोजनाओं के लिए Retrofit और OkHttp के विकल्प के रूप में उभरा। Retrofit के विपरीत, जिसने एनोटेशन के साथ Java दृष्टिकोण को पोर्ट किया, Ktor Client अनुरोध कॉन्फ़िगरेशन के लिए Kotlin DSL का उपयोग करता है — बिना एनोटेशन और रिफ्लेक्शन के। यह कोड को Kotlin डेवलपर्स के लिए अधिक पठनीय और टाइप-सेफ बनाता है।
2024 Kotlin Multiplatform सर्वेक्षण के अनुसार, Ktor Client का उपयोग 35% Kotlin Multiplatform Mobile (KMM) परियोजनाओं में किया जाता है, जो इसे Kotlin समुदाय में OkHttp के बाद दूसरा सबसे लोकप्रिय HTTP क्लाइंट बनाता है। Ktor को उन परियोजनाओं में प्राथमिकता दी जाती है जहाँ मल्टीप्लेटफ़ॉर्म समर्थन और Kotlin इकोसिस्टम के साथ मूल एकीकरण महत्वपूर्ण है।
Ktor Client आर्किटेक्चर प्लगइन की पाइपलाइन पर आधारित है। प्रत्येक अनुरोध स्थापित प्लगइन के अनुक्रम से गुज़रता है जो अनुरोध, प्रतिक्रिया को संशोधित कर सकते हैं या साइड क्रियाएँ कर सकते हैं — लॉगिंग, संपीड़न, सीरियलाइज़ेशन, प्रमाणीकरण।
HttpClient { } DSL ब्लॉक के माध्यम से HTTP क्लाइंट बनाते समय, आप इंजन (OkHttp, Android, CIO, Darwin) निर्दिष्ट करते हैं और प्लगइन स्थापित करते हैं। प्रत्येक इंजन एक विशिष्ट प्लेटफ़ॉर्म के लिए निम्न-स्तरीय अनुरोध भेजना लागू करता है: Android पर OkHttp इंजन का उपयोग किया जाता है, iOS पर — Darwin (URLSession), Desktop पर — CIO (Coroutine I/O)। HttpClient वर्तमान प्लेटफ़ॉर्म के लिए स्वचालित रूप से इष्टतम इंजन का चयन करता है।
Ktor Client में अनुरोध एक suspend फ़ंक्शन के माध्यम से निष्पादित किया जाता है, जिसका अर्थ है कोरूटीन के साथ पूर्ण एकीकरण। कोई कॉलबैक नहीं, कोई RxJava या LiveData नहीं — केवल suspend के साथ अनुक्रमिक कोड जो थ्रेड को ब्लॉक किए बिना एसिंक्रोनस रूप से काम करता है।
Ktor पाइपलाइन चरणों से बनी होती है: पहले अनुरोध स्थापित प्लगइन से गुज़रता है (जैसे JSON के लिए ContentNegotiation, लॉग के लिए Logging), फिर इंजन HTTP अनुरोध निष्पादित करता है, और प्रतिक्रिया डिसीरियलाइज़ेशन के लिए फिर से प्लगइन से गुज़रती है। प्रत्येक प्लगइन एक suspend फ़ंक्शन है जो पाइपलाइन कोरूटीन में निष्पादित होता है।
Ktor पाइपलाइन का एक महत्वपूर्ण लाभ सशर्त प्रसंस्करण करने की क्षमता है। एक प्लगइन URL या अनुरोध हेडर की जाँच कर सकता है और यदि शर्त पूरी नहीं होती है तो प्रसंस्करण छोड़ सकता है। उदाहरण के लिए, gzip के साथ ContentEncoding केवल उन प्रतिक्रियाओं पर लागू होता है जिनमें Content-Encoding: gzip हेडर होता है, और Auth केवल संरक्षित एंडपॉइंट के लिए सक्रिय होता है, सार्वजनिक API को प्रभावित किए बिना।
यह पाइपलाइन दृष्टिकोण आपको प्लगइन को लचीले ढंग से संयोजित करने की अनुमति देता है: आप JSON के साथ ContentNegotiation स्थापित कर सकते हैं, Bearer टोकन के साथ Auth जोड़ सकते हैं, ContentEncoding संपीड़न और HttpTimeout सक्षम कर सकते हैं — और ये सभी सही क्रम में एक साथ काम करेंगे। प्लगइन स्थापना का क्रम मायने रखता है: पहला स्थापित प्लगइन दूसरों की तुलना में पहले अनुरोध को संसाधित करेगा।
प्लगइन Ktor की मॉड्यूलर एक्सटेंशन प्रणाली है, जो Retrofit एनोटेशन और OkHttp इंटरसेप्टर को बदलती है। प्रत्येक प्लगइन एक विशिष्ट कार्य को हल करता है और HttpClient ब्लॉक में install() फ़ंक्शन के माध्यम से स्थापित किया जाता है। Ktor अंतर्निहित प्लगइन प्रदान करता है और कस्टम प्लगइन बनाने की अनुमति भी देता है।
| प्लगइन | उद्देश्य |
|---|---|
| ContentNegotiation | Kotlinx Serialization के माध्यम से JSON, XML सीरियलाइज़ेशन और डिसीरियलाइज़ेशन |
| Logging | कॉन्फ़िगरेबल स्तर के साथ अनुरोध और प्रतिक्रिया लॉगिंग |
| Auth | प्रमाणीकरण: Basic, Bearer, Digest स्वचालित टोकन रिफ्रेश के साथ |
| HttpTimeout | कनेक्शन, रीड और अनुरोध टाइमआउट कॉन्फ़िगरेशन |
| ContentEncoding | पारदर्शी gzip और deflate संपीड़न |
| DefaultRequest | सभी अनुरोधों के लिए डिफ़ॉल्ट मान सेट करना |
विशिष्ट कार्यों के लिए, createClientPlugin के माध्यम से एक कस्टम प्लगइन बनाया जाता है। प्लगइन अनुरोध (onRequest), प्रतिक्रिया (onResponse) को इंटरसेप्ट कर सकता है या त्रुटियों (onError) को संभाल सकता है। यह OkHttp के Interceptor को पूरी तरह से बदल देता है, लेकिन टाइप की गई Kotlin API और suspend फ़ंक्शन समर्थन के साथ।
कस्टम प्लगइन मीट्रिक जोड़ने, स्वचालित पुनर्प्रयास तर्क, अनुरोध ट्रेसिंग, या एंडपॉइंट के A/B परीक्षण के लिए सुविधाजनक हैं। OkHttp इंटरसेप्टर के विपरीत, Ktor प्लगइन Kotlin में लिखे जाते हैं और कोरूटीन संदर्भ में चलते हैं, जिससे त्रुटि और टाइमआउट हैंडलिंग सरल हो जाती है।
अनुरोध डिबगिंग के लिए, Logging प्लगइन का उपयोग ALL, HEADERS या BODY स्तर के साथ किया जाता है। Logging विधि, URL, स्थिति, हेडर और अनुरोध और प्रतिक्रिया का बॉडी आउटपुट करता है। OkHttp के HttpLoggingInterceptor के विपरीत, Ktor Logging एसिंक्रोनस रूप से काम करता है और कॉन्फ़िगरेशन बदलने के लिए एप्लिकेशन को रोके बिना लॉग स्तर (ERROR, WARN, INFO, DEBUG) द्वारा फ़िल्टर करने के लिए कॉन्फ़िगर किया जा सकता है।
Ktor Client का उपयोग करके एक बुनियादी GET अनुरोध देखें। JSON के लिए ContentNegotiation प्लगइन स्थापित करके एक HttpClient बनाया जाता है। अनुरोध suspend फ़ंक्शन get() के माध्यम से निष्पादित होता है, और परिणाम स्वचालित रूप से डेटा क्लास में डिसीरियलाइज़ हो जाता है।
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()
}
बॉडी के साथ POST अनुरोध के लिए contentType() और body() के साथ post() फ़ंक्शन का उपयोग किया जाता है। Ktor स्थापित ContentNegotiation के माध्यम से ऑब्जेक्ट को स्वचालित रूप से JSON में सीरियलाइज़ करता है। DSL शैली कोड को अनुक्रमिक और पठनीय बनाती है।
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)
}
}
HttpTimeout और DefaultRequest कॉन्फ़िगरेशन के लिए दो प्रमुख प्लगइन हैं। HttpTimeout समय सीमा निर्धारित करता है, और DefaultRequest सभी अनुरोधों के लिए हेडर और URL पैरामीटर निर्दिष्ट करता है, प्रत्येक कॉल में कोड डुप्लिकेशन को समाप्त करता है।
val client = HttpClient {
install(HttpTimeout) {
connectTimeoutMillis = 15000
requestTimeoutMillis = 30000
}
install(DefaultRequest) {
url("https://api.github.com/")
header("Accept", "application/json")
}
}
मल्टीप्लेटफ़ॉर्म OkHttp और Retrofit पर Ktor का मुख्य लाभ है। Ktor Client JVM (Android, Server), Native (iOS, macOS, Windows, Linux) और JS (Browser) पर चलता है। वही HTTP क्लाइंट कोड बिना बदलाव के सभी प्लेटफ़ॉर्म पर चलता है, जो विशेष रूप से Kotlin Multiplatform परियोजनाओं के लिए मूल्यवान है।
प्रत्येक प्लेटफ़ॉर्म के लिए, Ktor अपना स्वयं का इंजन उपयोग करता है। Android पर, डिफ़ॉल्ट रूप से OkHttp इंजन का उपयोग किया जाता है, जो OkHttp इकोसिस्टम के साथ पूर्ण संगतता प्रदान करता है। iOS पर, URLSession पर आधारित DarwinEngine का उपयोग किया जाता है। Server के लिए — CIOEngine (Coroutine I/O)। इंजन को स्पष्ट रूप से निर्दिष्ट किया जा सकता है: HttpClient(OkHttp) { } या HttpClient(Darwin) { }।
इंजन चुनते समय, इसकी क्षमताओं पर विचार करें: OkHttp इंजन HTTP/2 और कनेक्शन पूलिंग का समर्थन करता है, DarwinEngine मूल iOS नेटवर्क एकीकरण और बैकग्राउंड URLSession सत्र प्रदान करता है, CIOEngine बाहरी निर्भरताओं के बिना एक शुद्ध कोरूटीन कार्यान्वयन है। वेब लक्ष्यों के लिए, JsEngine या BrowserEngine का उपयोग किया जाता है, जो fetch API के माध्यम से काम करता है।
सभी प्लेटफ़ॉर्म पर एकीकृत API के लिए धन्यवाद, डेटा लोड करने का कोड Android, iOS और Desktop पर समान दिखता है। यह Retrofit (Android) और URLSession (iOS) पर अलग-अलग कार्यान्वयन की तुलना में KMM परियोजनाओं में कोड डुप्लिकेशन को 60–80% तक कम करता है। प्लगइन भी बिना बदलाव के सभी प्लेटफ़ॉर्म पर काम करते हैं।
HttpClient बंद करने की अनदेखी Ktor में एक सामान्य गलती है। HttpClient Closeable को लागू करता है, और एप्लिकेशन समाप्त होने पर इसे client.close() के माध्यम से बंद किया जाना चाहिए। Android में, यह Activity के onDestroy() या ViewModel.onCleared() में किया जाता है। बंद न किया गया क्लाइंट कोरूटीन और इंजन थ्रेड लीक का कारण बनता है।
गलत प्लगइन क्रम अनुरोध प्रसंस्करण को तोड़ सकता है। उदाहरण के लिए, ContentNegotiation को DefaultRequest से पहले स्थापित किया जाना चाहिए ताकि सामग्री प्रकार सही ढंग से लागू हो। Logging को अंतिम रूप से स्थापित करने की अनुशंसा की जाती है ताकि सभी संशोधनों के बाद अनुरोध के अंतिम संस्करण को लॉग किया जा सके। यदि प्लगइन अप्रत्याशित व्यवहार करते हैं तो क्रम के साथ प्रयोग करें।
suspend फ़ंक्शन में अपवाद हैंडलिंग की कमी। Ktor नेटवर्क त्रुटियों के लिए IOException और HTTP 4xx स्थितियों के लिए ClientRequestException फेंकता है। get(), post() और अन्य विधियों के प्रत्येक कॉल के लिए try-catch ब्लॉक अनिवार्य है। प्रत्येक विधि में try-catch डुप्लिकेट किए बिना वैश्विक त्रुटि हैंडलिंग के लिए HttpClient ब्लॉक में HttpResponseValidator का उपयोग करें।
अक्सर पूछे जाने वाले प्रश्न
Ktor बिना एनोटेशन और रिफ्लेक्शन के Kotlin DSL और प्लगइन का उपयोग करता है। Retrofit Java एनोटेशन और रिफ्लेक्शन पर बनाया गया है। Ktor मल्टीप्लेटफ़ॉर्म का समर्थन करता है, Retrofit केवल JVM/Android। Ktor मूल रूप से कोरूटीन के साथ काम करता है, Retrofit ने एक रैपर के माध्यम से suspend जोड़ा।
Android के लिए, OkHttp इंजन इष्टतम है — यह OkHttp इकोसिस्टम, कनेक्शन पूलिंग, कैशिंग और HTTP/2 के साथ संगतता प्रदान करता है। इसे HttpClient(OkHttp) { } के माध्यम से चुनें। विकल्प Ktor में निर्मित CIOEngine है, लेकिन यह Android पर कम स्थिर है।
हाँ, Ktor उपयुक्त इंजन के माध्यम से HTTP/2 का समर्थन करता है। OkHttp इंजन OkHttp से HTTP/2 समर्थन प्राप्त करता है। iOS पर DarwinEngine URLSession के माध्यम से HTTP/2 का समर्थन करता है। CIOEngine सर्वर साइड पर HTTP/2 का समर्थन करता है। इंजन का चुनाव प्रोटोकॉल समर्थन के स्तर को निर्धारित करता है।
bearer { } सेटअप के साथ Auth प्लगइन का उपयोग करें। प्लगइन स्वचालित रूप से प्रत्येक अनुरोध में Authorization हेडर जोड़ता है और refreshTokens के माध्यम से 401 प्रतिक्रिया पर टोकन रिफ्रेश कर सकता है। उदाहरण: install(Auth) { bearer { loadTokens { BearerTokens(token, refreshToken) } } }.
हाँ, Ktor Client DarwinEngine के माध्यम से iOS पर पूरी तरह से काम करता है, जो URLSession का उपयोग करता है। सभी प्लगइन, सीरियलाइज़ेशन और कोरूटीन iOS पर Android की तरह ही काम करते हैं। यह Ktor को Kotlin Multiplatform Mobile (KMM) परियोजनाओं के लिए प्राथमिक HTTP क्लाइंट बनाता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें