ما هو GraphQL؟
GraphQL هي لغة استعلام (Query Language) لتطبيقات الواجهات البرمجية (APIs)، طوّرتها Meta (فيسبوك) عام 2012 ونشرتها كمصدر مفتوح عام 2015.
الفكرة الأساسية:
- العميل (Client) يحدد بالضبط البيانات التي يحتاجها.
- الخادم (Server) يُرجِع نفس البنية التي طلبها العميل — لا زيادة ولا نقصان.
الفرق بين REST و GraphQL
| REST | GraphQL |
|---|---|
| نقاط نهاية (Endpoints) متعددة لكل مورد | نقطة نهاية واحدة /graphql |
| إما ترجع كامل الحقول أو تضمين حقول إضافية | العميل يحدد الحقول المطلوبة |
| Over-fetching (جلب بيانات زائدة) و Under-fetching (جلب بيانات ناقصة) | يجلب بالضبط ما يُطلب |
| الإصدارات (v1, v2...) غالباً | لا حاجة للإصدارات — يُضاف الحقل الجديد بجانب القديم |
// REST — `/api/users/1` يُرجع كل الحقول حتى لو احتجنا الاسم فقط
GET /api/users/1
// Response: { id, name, email, address, phone, ... }
// GraphQL — نطلب الاسم فقط
query {
user(id: 1) {
name
}
}
// Response: { "data": { "user": { "name": "أحمد" } } }
الاستعلامات الأساسية (Queries)
Query بسيط
query {
users {
id
name
email
}
}
Query مع متغيرات (Variables)
query GetUser($id: ID!) {
user(id: $id) {
name
posts {
title
}
}
}
تمرير المتغيرات
{
"id": "1"
}
المزايا
- مرونة تامة — العميل يتحكم بالشكل النهائي للبيانات.
- كفاءة عالية — لا Over-fetching أو Under-fetching.
- نظام أنواع قوي (Type System) — كل شيء مُعرّف مسبقاً عبر Schema.
- توثيق تلقائي (Introspection) — أدوات مثل GraphiQL و Apollo Studio.
العيوب
- تعقيد إضافي — يحتاج Schema و Resolvers.
- مشاكل أداء — استعلامات متداخلة بعمق قد تثقل الخادم.
- التخزين المؤقت (Caching) — أصعب من REST لأن كل الطلبات تذهب إلى نقطة نهاية واحدة.
- رفع الملفات — ليس مدمجاً في البروتوكول.
⚠️ GraphQL ليس بديلاً كاملاً عن REST. لكلٍّ منهما مكانه.
خلاصة
GraphQL يمنح العميل تحكّماً كاملاً بالبيانات التي يجلبها، مما يقلل حجم الاستجابة ويسرّع التطبيقات. لكنه يأتي بتعقيد إضافي في الإعداد والصيانة.
🎯 التالي: GraphQL — Schema و Resolvers