مقدمة: لماذا Kotlin و REST API؟
\nتطوير الويب الحديث لا يمكن تصوره بدون REST API. إذا كنت معتادًا بالفعل على Python وأطر العمل مثل Flask أو FastAPI، فمن المحتمل أنك تقدر البساطة والسرعة في إنشاء تطبيقات الخادم. Kotlin، كلغة حديثة لـ JVM، تقدم أناقة وإيجازًا لا يقل عن ذلك، خاصة عند دمجها مع إطار العمل Ktor.
\nفي هذه المقالة، سنقوم في غضون 30 دقيقة بإنشاء REST API كامل بلغة Kotlin. ستتعلم كيفية إعداد المشروع، وإنشاء المسارات، ومعالجة JSON، وتشغيل الخادم. لا ماء - فقط تطبيق عملي.
\nإذا كنت ترغب في توسيع مجموعة تقنياتك أو ببساطة تجربة Kotlin لتطوير الواجهة الخلفية، فهذا الدليل مناسب لك.
\n\nالخطوة 1: إعداد المشروع والتبعيات
\nللبدء، سنحتاج إلى مشروع بلغة Kotlin. سنستخدم أداة البناء Gradle (أو Maven - حسب اختيارك). أسرع طريقة هي إنشاء مشروع عبر Ktor Project Generator.
\nاختر الخيارات التالية:
\n- \n
- نظام البناء: Gradle Kotlin DSL \n
- المحرك: Netty (أو أي محرك آخر) \n
- الإضافات: Content Negotiation (JSON)، Routing، Status Pages \n
بعد تنزيل الأرشيف، قم بفك ضغطه وافتحه في IntelliJ IDEA أو أي محرر آخر.
\nإذا كنت تنشئ المشروع يدويًا، أضف التبعيات التالية إلى ملف build.gradle.kts:
dependencies {\n implementation("io.ktor:ktor-server-core:2.3.0")\n implementation("io.ktor:ktor-server-netty:2.3.0")\n implementation("io.ktor:ktor-server-content-negotiation:2.3.0")\n implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.0")\n implementation("ch.qos.logback:logback-classic:1.4.11")\n}\nالآن، لننشئ ملف Application.kt - نقطة الدخول للتطبيق.
import io.ktor.server.engine.*\nimport io.ktor.server.netty.*\nimport io.ktor.server.application.*\nimport io.ktor.server.plugins.contentnegotiation.*\nimport io.ktor.serialization.kotlinx.json.*\nimport kotlinx.serialization.json.Json\n\nfun main() {\n embeddedServer(Netty, port = 8080, host = "0.0.0.0") {\n configureSerialization()\n configureRouting()\n }.start(wait = true)\n}\n\nfun Application.configureSerialization() {\n install(ContentNegotiation) {\n json(Json {\n prettyPrint = true\n isLenient = true\n })\n }\n}\nتم! لدينا إعداد أساسي للعمل مع JSON وخادم على المنفذ 8080.
\n\nالخطوة 2: إنشاء نموذج البيانات والتخزين
\nلـ REST API نحتاج إلى بيانات. لننشئ نموذجًا بسيطًا User (مستخدم) ومخزنًا مؤقتًا في الذاكرة.
\nأولاً، دعنا نحدد فئة بيانات مع التعليق التوضيحي @Serializable:
import kotlinx.serialization.Serializable\n\n@Serializable\ndata class User(\n val id: Int,\n val name: String,\n val email: String\n)\nالآن، لننشئ كائن مستودع لتخزين المستخدمين:
\nobject UserRepository {\n private val users = mutableListOf(\n User(1, "إيفان إيفانوف", "ivan@example.com"),\n User(2, "ماريا بيتروفا", "maria@example.com")\n )\n\n fun getAll(): List<User> = users.toList()\n\n fun getById(id: Int): User? = users.find { it.id == id }\n\n fun add(user: User): User {\n users.add(user)\n return user\n }\n\n fun delete(id: Int): Boolean = users.removeIf { it.id == id }\n}\nهذا حل بسيط، لكنه مثالي للتوضيح في غضون 30 دقيقة.
\n\nالخطوة 3: إعداد المسارات (نقاط نهاية REST)
\nالآن الجزء الممتع - لننشئ نقاط نهاية لعمليات CRUD. أضف ملف Routing.kt:
import io.ktor.server.routing.*\nimport io.ktor.server.response.*\nimport io.ktor.server.request.*\n\nfun Application.configureRouting() {\n routing {\n route("/api/u