Ktor ایک غیر مطابقت پذیر HTTP کلائنٹ اور سرور فریم ورک ہے Kotlin کے لیے جو ملٹی پلیٹ فارم ڈیولپمنٹ کو سپورٹ کرتا ہے۔ لائبریری Kotlin coroutines پر بنائی گئی ہے اور 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 coroutines پر بنایا گیا ہے، جو تھریڈ بلاک کیے بغیر موثر غیر مطابقت پذیر درخواستوں پر عملدرآمد فراہم کرتا ہے۔ سرور سائیڈ روٹنگ، درخواستوں کی پروسیسنگ اور WebSocket کنکشنز کے ساتھ HTTP سرور بنانے کی اجازت دیتا ہے۔
Ktor پلگ ان آرکیٹیکچر استعمال کرتا ہے: تمام اضافی خصوصیات — لاگنگ، سیریلائزیشن، تصدیق — پلگ ان کے ذریعے منسلک ہوتی ہیں۔ یہ لائبریری کو ماڈیولر بناتا ہے اور صرف ضروری اجزاء کو منسلک کرنے کی اجازت دیتا ہے، جس سے حتمی ایپلیکیشن کا سائز کم ہوتا ہے۔
تمام پلیٹ فارمز پر متحد API کی بدولت، ڈیولپر کو iOS اور Android کے لیے مختلف HTTP کلائنٹ سیکھنے کی ضرورت نہیں ہے۔ ملٹی پلیٹ فارم منصوبے میں، نیٹ ورک پرت کا کوڈ مکمل طور پر مشترکہ ہوتا ہے، اور پلیٹ فارم کے لیے مخصوص نفاذ HttpClient انجن کے پیچھے چھپا ہوتا ہے۔ اس سے ڈیولپمنٹ کا وقت کم ہوتا ہے اور پلیٹ فارم کے فرق سے متعلق غلطیوں کی تعداد میں کمی آتی ہے۔
Ktor خصوصیات کا ایک سیٹ فراہم کرتا ہے جو اسے جدید Kotlin منصوبوں، خاص طور پر ملٹی پلیٹ فارم منصوبوں کے لیے ایک پرکشش انتخاب بناتا ہے۔
Ktor JVM، Android، iOS، macOS، Windows، Linux، JavaScript اور Wasm پر کام کرتا ہے۔ وہی HTTP کلائنٹ کوڈ بغیر تبدیلی کے تمام پلیٹ فارمز پر چلتا ہے۔ یہ OkHttp یا URLSession سے منسلک لائبریریوں پر ایک اہم فائدہ ہے۔
Kotlin میں coroutines کال بیک کے بغیر قدرتی غیر مطابقت پذیری فراہم کرتے ہیں۔ ہر درخواست ایک suspend فنکشن ہے جسے کسی بھی coroutine سے بلایا جا سکتا ہے۔ 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()
}
Ktor میں POST درخواست contentType اور setBody کے ساتھ post طریقہ کے ذریعے ڈیٹا کلاس کو JSON باڈی کے طور پر بھیجتی ہے۔ 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 اس منظرنامے میں بھی کام کرتا ہے، لیکن اس کا پلگ ان ماحولیاتی نظام کم وسیع ہے۔ دونوں لائبریریاں coroutines کو سپورٹ کرتی ہیں اور موازنہ کارکردگی دیتی ہیں۔
| معیار | 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 کا coroutines پر ملٹی پلیٹ فارم 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں