GraphQL على Kotlin: نظرة شاملة على المكتبات والأدوات
GraphQL هي لغة استعلام لواجهات API وبيئة تشغيل لتنفيذ هذه الاستعلامات مع بياناتك الحالية. تمنح العملاء القدرة على طلب البيانات التي يحتاجونها بالضبط، مما يجعلها بديلاً قوياً لـ REST. في نظام Kotlin البيئي، توجد عدة مكتبات ناضجة لبناء الجزء الخادم من GraphQL. في هذه المقالة، سنحلل بالتفصيل الأدوات الرئيسية، صياغتها، وأمثلة على استخدامها.
لماذا Kotlin لـ GraphQL؟
Kotlin، كونه لغة مكتوبة بشكل ثابت تعمل على JVM، مناسب تماماً لبناء مخططات GraphQL آمنة من حيث الأنواع. يساعد مترجم Kotlin في تجنب الأخطاء في مرحلة كتابة الكود، بينما تجعل الصياغة التعبيرية الكود نظيفاً وموجزاً. تشمل المكتبات الرئيسية للعمل مع GraphQL في Kotlin:
- graphql-kotlin (من Expedia Group) — المكتبة الأكثر شيوعاً، والمتكاملة بشكل وثيق مع Spring Boot.
- KGraphQL — بديل يركز على التكوين البسيط وواجهة API بسيطة.
- Apollo Kotlin — مكتبة عميل لنظام Android و KMP، ولكنها توفر أيضاً إمكانيات خادم.
مكتبة graphql-kotlin
graphql-kotlin هي مجموعة من المكتبات لبناء خوادم GraphQL على Kotlin. النهج الأساسي هو استخدام التعليقات التوضيحية وفئات البيانات لإنشاء المخطط تلقائياً.
التثبيت
أضف التبعية في build.gradle.kts:
dependencies { implementation("com.expediagroup:graphql-kotlin-spring-server:7.0.0") implementation("com.expediagroup:graphql-kotlin-schema-generator:7.0.0")}مثال: استعلام بسيط
لنعرف فئة بيانات ومحللاً:
import com.expediagroup.graphql.server.operations.Query
data class User(val id: Int, val name: String, val email: String)
class UserQuery : Query { fun getUser(id: Int): User { // محاكاة الحصول من قاعدة البيانات return User(id = id, name = "Alice", email = "alice@example.com") }}سينشئ graphql-kotlin المخطط تلقائياً. الآن يمكن للعميل تنفيذ الاستعلام:
query { getUser(id: 1) { name email }}سيحتوي الرد على الحقول المطلوبة فقط:
{ "data": { "getUser": { "name": "Alice", "email": "alice@example.com" } }}التحويرات (تعديل البيانات)
للتحويرات، يُستخدم الواجهة Mutation:
import com.expediagroup.graphql.server.operations.Mutation
class UserMutation : Mutation { fun createUser(name: String, email: String): User { // منطق إنشاء المستخدم return User(id = 2, name = name, email = email) }}الاستعلام المقابل:
mutation { createUser(name: "Bob", email: "bob@example.com") { id name }}مكتبة KGraphQL
تقدم KGraphQL نهجاً أكثر توجهاً نحو DSL، دون الحاجة إلى تعليقات توضيحية. يتم بناء المخطط برمجياً.
التثبيت
dependencies { implementation("com.apurebase:kgraphql:0.18.0") implementation("com.apurebase:kgraphql-ktor:0.18.0") // لـ Ktor}مثال: تعريف المخطط
import com.apurebase.kgraphql.schema.dsl.SchemaBuilder
val schema = SchemaBuilder { query("hello") { resolver { -> "Hello, World!" } }
query("user") { resolver { id: Int -> User(id = id, name = "Charlie", email = "charlie@example.com") } }
mutation("createUser") { resolver { name: String, email: String -> User(id = 3, name = name, email = email) } }}ثم نربطه بإطار الويب