مقدمة
Kotlin هي لغة برمجة حديثة تكتسب شعبية سريعة في تطوير الواجهة الخلفية. بفضل بناء الجملة المختصر، والتوافق الكامل مع Java، والأدوات القوية مثل إطار العمل Ktor، فإن كتابة REST API بلغة Kotlin تستغرق حرفياً 30 دقيقة. في هذه المقالة، سنقوم بإنشاء REST API كامل لإدارة قائمة المهام (Todo API). ستتعلم كيفية إعداد المشروع، وإنشاء نقاط النهاية، وتوصيل قاعدة البيانات، واختبار API. لا نظرية زائدة — فقط تطبيق عملي.
الخطوة 1: إعداد المشروع والتبعيات
لبدء سريع، نستخدم IntelliJ IDEA (Community Edition) أو أي محرر آخر. سنقوم بإنشاء مشروع Gradle جديد باستخدام Kotlin DSL.
إنشاء هيكل المشروع
أضف التبعيات التالية إلى ملف build.gradle.kts:
plugins { kotlin("jvm") version "1.9.22" application}
repositories { mavenCentral()}
dependencies { implementation("io.ktor:ktor-server-core:2.3.7") implementation("io.ktor:ktor-server-netty:2.3.7") implementation("io.ktor:ktor-server-content-negotiation:2.3.7") implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.7") implementation("org.jetbrains.exposed:exposed-core:0.44.1") implementation("org.jetbrains.exposed:exposed-dao:0.44.1") implementation("org.jetbrains.exposed:exposed-jdbc:0.44.1") implementation("com.h2database:h2:2.2.224") implementation("ch.qos.logback:logback-classic:1.4.14")}
application { mainClass.set("ApplicationKt")}نحن نستخدم:
- Ktor — إطار عمل غير متزامن خفيف الوزن لخوادم HTTP.
- Exposed — ORM للعمل مع قواعد البيانات.
- H2 — قاعدة بيانات مدمجة للتطوير.
- Kotlinx.serialization — للعمل مع JSON.
الخطوة 2: إنشاء نموذج البيانات وتوصيل قاعدة البيانات
سنحدد هيكل جدول المهام. قم بإنشاء ملف Database.kt:
import org.jetbrains.exposed.sql.Tableimport org.jetbrains.exposed.sql.insertimport org.jetbrains.exposed.sql.selectAllimport org.jetbrains.exposed.sql.transactions.transaction
object Tasks : Table() { val id = integer("id").autoIncrement() val title = varchar("title", 255) val completed = bool("completed").default(false)
override val primaryKey = PrimaryKey(id)}
data class Task(val id: Int, val title: String, val completed: Boolean)
fun initDatabase() { Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver") transaction { SchemaUtils.create(Tasks) }}يقوم هذا الكود بإنشاء جدول Tasks بثلاثة حقول: id و title و completed. الدالة initDatabase() تقوم بتهيئة قاعدة البيانات في الذاكرة.
الخطوة 3: كتابة وحدات التحكم في REST API
الآن سنقوم بإنشاء ملف التطبيق الرئيسي Application.kt. هنا سنحدد جميع نقاط النهاية.
الإعداد الأساسي للخادم
import io.ktor.server.application.*import io.ktor.server.engine.*import io.ktor.server.netty.*import io.ktor.server.routing.*import io.ktor.server.response.*import io.ktor.server.request.*import io.ktor.serialization.kotlinx.json.*import io.ktor.server.plugins.contentnegotiation.*
fun main() { embeddedServer(Netty, port = 8080) { install(ContentNegotiation) { json() } initDatabase() configureRouting() }.start(wait = true)}تنفيذ نقاط نهاية CRUD
fun Application.configureRouting() { routing { // الحصول على جميع المهام get("/tasks") { val tasks = transaction { Tasks.selectAll().map { row -> Task( id = row[Tasks.id],