REST API و GraphQL الفرق الحقيقي بينهما ومتى تستخدم كل تقنية؟
فيه مطورين أول ما يتعلموا يعملوا API يحفظوا: GET - POST - PUT - DELETE وبعدها يقولك: "أنا كده بعمل RESTful API"
لكن الحقيقة؟ مش كل API فيها GET و POST تبقى RESTful. ومش كل Endpoint شغال يبقى معمول صح.
وأول ما تسمع GraphQL ممكن تحس إنه مجرد:
REST لكن بطريقة مختلفة شوية.
وده مش صحيح. GraphQL مختلف من الأساس في طريقة التفكير. وقبل المقارنة لازم نفهم يعني إيه REST أصلاً.
ما هو RESTful API؟
REST اختصار لـ:
Representational State Transfer
الفكرة إنك تتعامل مع النظام كـ Resources بدل أوامر مباشرة.
بدل:
/getUser
/createOrder
/deleteProduct
تفكر بالشكل ده:
/users
/orders
/products
ثم تستخدم HTTP Methods:
GET /users/5
POST /users
PUT /users/5
PATCH /users/5
DELETE /users/5
- GET: جلب بيانات
- POST: إنشاء بيانات
- PUT: تعديل كامل
- PATCH: تعديل جزئي
- DELETE: حذف
الفكرة المهمة:
- الـ URL يمثل Resource
- الـ Method يمثل العملية
أخطاء شائعة في تصميم REST APIs
كتير تشوف حاجات زي:
POST /getAllProducts
POST /deleteUser
GET /createOrder
وده مش RESTful حتى لو شغال.
فكرة Stateless في REST
REST مبني على مفهوم مهم:
Statelessness
كل Request لازم يحمل المعلومات الخاصة بيه. السيرفر ميفترضش إنه فاكر طلب قديم.
زي:
- Authorization Token
- Headers
- Cookies
وده بيساعد في:
- Scaling
- Load Balancing
- Caching
- Debugging
قوة REST الحقيقية
REST بيستفيد من HTTP بالكامل:
200 OK
201 Created
204 No Content
400 Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
500 Internal Server Error
وكمان:
- Headers
- ETags
- Cache-Control
- CDN Caching
مشكلة REST: كثرة Requests
تخيل شاشة Profile محتاجة:
- بيانات المستخدم
- الطلبات
- المنتجات
- السلة
ممكن تعمل:
GET /users/5
GET /users/5/orders
GET /orders/101/items
GET /orders/102/items
GET /cart/summary
يعني شاشة واحدة فقط تعمل 5 أو 6 Requests.
وده بيظهر أكثر في:
- Mobile Apps
- Slow Networks
هنا ظهر GraphQL
GraphQL خلى الـ Client يحدد البيانات المطلوبة بنفسه.
مثال:
query {
user(id: 5) {
name
orders {
total
items {
productName
price
}
}
cart {
itemsCount
}
}
}
الرد هيكون بالبيانات المطلوبة فقط.
لا زيادة… ولا نقصان.
مشاكل REST التي يحلها GraphQL
1- Over-fetching
Endpoint ترجع بيانات أكتر من المطلوب.
مثلاً:
{
"name": "Belal",
"phone": "...",
"address": "...",
"birthDate": "..."
}
مع إن الشاشة محتاجة الاسم فقط.
2- Under-fetching
Endpoint واحدة لا تكفي، فتحتاج Requests إضافية.
هل GraphQL أسرع من REST؟
الإجابة: مش دائمًا.
GraphQL بيضيف:
- Parsing
- Validation
- Resolvers
- Authorization
- Complexity Analysis
وده معناه Overhead إضافي.
في الأنظمة البسيطة: REST أحيانًا أسرع.
ما هي Resolvers في GraphQL؟
في REST: كل Endpoint لها Controller.
في GraphQL: كل Field تقريبًا له Resolver.
User Resolver
↓
Orders Resolver
↓
Items Resolver
مشكلة N+1 Problem في GraphQL
لو عندك: 100 User
والكل عنده Orders.
ممكن يحصل:
SELECT * FROM users;
SELECT * FROM orders WHERE user_id = 1;
SELECT * FROM orders WHERE user_id = 2;
SELECT * FROM orders WHERE user_id = 3;
...
يعني 101 Query بدل واحدة أو اتنين.
عشان كده المشاريع الكبيرة تستخدم:
DataLoader Pattern
ليه Caching أسهل في REST؟
REST:
GET /products/5
سهل يتخزن في:
- Browser Cache
- CDN
- Reverse Proxy
POST /graphql
فالـ Caching أعقد.
إمتى تستخدم REST؟
- CRUD Systems
- Authentication
- Public APIs
- Uploads
- Webhooks
- Cache-heavy APIs
إمتى تستخدم GraphQL؟
- Dashboards
- React Apps
- Mobile Apps
- Complex Data
- Dynamic UI
هل لازم تختار واحد فقط؟
لا. شركات كتير تستخدم الاثنين:
REST
- Login
- Uploads
- Payments
- Webhooks
GraphQL
- Dashboards
- Aggregated Data
- Complex Screens
وده اسمه: Hybrid Architecture
الخلاصة
GraphQL مش REST الجديد. وREST مش تقنية قديمة.
كل واحد معمول لحل مشاكل مختلفة.
المهندس الشاطر مش اللي يتبع الترند، لكن اللي يعرف:
إمتى يستخدم كل تقنية… وليه.