مقدمة
Kotlin هي لغة برمجة حديثة وموجزة وآمنة تكتسب شعبية في تطوير تطبيقات الخادم. بفضل توافقها مع Java وأطر العمل القوية مثل Ktor، يمكنك إنشاء REST API متكامل في غضون نصف ساعة. في هذه المقالة، سنوضح كيفية كتابة REST API باستخدام Kotlin وإطار العمل Ktor، حتى لو كنت مبتدئًا.
سنقوم بإنشاء تطبيق بسيط لإدارة قائمة المهام (Todo API) مع دعم عمليات CRUD: الإنشاء والقراءة والتحديث والحذف. ستستغرق العملية بأكملها 30 دقيقة كحد أقصى إذا اتبعت التعليمات.
1. إعداد المشروع والتبعيات
للبدء، ستحتاج إلى IntelliJ IDEA (Community Edition) و Gradle. سنقوم بإنشاء مشروع Kotlin جديد مع دعم Ktor.
الخطوة 1: إنشاء مشروع Gradle
افتح IntelliJ IDEA وأنشئ مشروعًا جديدًا: File → New → Project. اختر Gradle وحدد اللغة Kotlin. اضغط على Finish.
الخطوة 2: إضافة تبعيات Ktor
افتح ملف build.gradle.kts وأضف التبعيات التالية:
plugins { kotlin("jvm") version "1.9.0" application}
repositories { mavenCentral()}
dependencies { implementation("io.ktor:ktor-server-core:2.3.0") implementation("io.ktor:ktor-server-netty:2.3.0") implementation("io.ktor:ktor-server-content-negotiation:2.3.0") implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.0") implementation("ch.qos.logback:logback-classic:1.4.11")}
application { mainClass.set("ApplicationKt")}اضغط على زر Sync Now في الزاوية اليمنى العليا لتحميل التبعيات.
2. إنشاء نموذج البيانات والخدمة
قبل كتابة المسارات، سنحدد نموذج البيانات لمهمتنا وخدمة بسيطة لتخزين البيانات في الذاكرة.
نموذج TodoItem
أنشئ ملف TodoItem.kt في مجلد src/main/kotlin:
import kotlinx.serialization.Serializable
@Serializabledata class TodoItem( val id: Int, val title: String, val completed: Boolean = false)خدمة TodoService
أنشئ ملف TodoService.kt:
import java.util.concurrent.atomic.AtomicInteger
class TodoService { private val items = mutableListOf<TodoItem>() private val idCounter = AtomicInteger(1)
fun getAll(): List<TodoItem> = items.toList()
fun getById(id: Int): TodoItem? = items.find { it.id == id }
fun create(title: String): TodoItem { val newItem = TodoItem(id = idCounter.getAndIncrement(), title = title) items.add(newItem) return newItem }
fun update(id: Int, title: String?, completed: Boolean?): TodoItem? { val index = items.indexOfFirst { it.id == id } if (index == -1) return null val current = items[index] val updated = current.copy( title = title ?: current.title, completed = completed ?: current.completed ) items[index] = updated return updated }
fun delete(id: Int): Boolean = items.removeAll { it.id == id }}3. إعداد الخادم والمسارات
الآن سنقوم بإنشاء ملف التطبيق الرئيسي Application.kt وتحديد مسارات REST API.
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, host = "0.0.0.0") { configureSerialization() configureRouting() }.start(wait = true)}
fun