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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন