ما هي واجهة REST API؟ شرح مبسط للمبتدئين مع أمثلة عملية

كل تطبيق موبايل يعرض لك حسابك، وكل موقع يجلب منتجاتك من قاعدة بيانات، وكل لوحة تحكم تعرض إحصاءاتك، يعتمد على شيء واحد في الخلفية: واجهة برمجة تطبيقات أي API. ومن أشهر أنواعها وأكثرها استخدامًا REST. فهمها ليس رفاهية للمبرمج؛ هو الجسر الذي يربط واجهة المستخدم بالخادم وقاعدة البيانات. وحتى لو لم تكن مبرمجًا وتشتري تطبيقًا أو موقعًا، فمعرفة المفهوم تساعدك على فهم عرض السعر والمواصفات.
نشرح هنا المفهوم بلغة بسيطة ثم نطبقه بأمثلة كود، وننتهي بأفضل الممارسات التي نتبعها في مشاريع حقيقية.
ما هو الـAPI؟
الـAPI (Application Programming Interface) عقد بين برنامجين: «إن أرسلت لي طلبًا بهذا الشكل فسأرد عليك بهذا الشكل». تخيّل مطعمًا: أنت الزبون (الواجهة)، والنادل هو الـAPI، والمطبخ هو الخادم وقاعدة البيانات. لا تدخل المطبخ؛ تطلب من النادل بقائمة محددة، فيعود إليك بالطبق. والنادل يرفض الطلبات غير الموجودة في القائمة، وهذه حماية.
وما معنى REST؟
REST أسلوب في تصميم الـAPI على الويب يقوم على أفكار بسيطة:
- الموارد (Resources): كل شيء له عنوان URL، مثل
/productsو/products/15و/users/7/orders. - أفعال HTTP الموحدة: GET للقراءة وPOST للإنشاء وPUT/PATCH للتعديل وDELETE للحذف.
- بلا حالة (Stateless): كل طلب يحمل كل ما يحتاجه الخادم لفهمه، فلا يعتمد على طلب سابق.
- تمثيلات: غالبًا JSON، وهو نص منظم يفهمه كل لغة برمجة.
وهي ليست بروتوكولًا صارمًا بل أسلوب، ولذلك ستجد واجهات «شبه REST» كثيرة. ومرجع بروتوكول HTTP الأساسي هنا: HTTP على MDN.
الأفعال وما تفعله
| الفعل | الغرض | مثال | ملاحظة |
|---|---|---|---|
| GET | قراءة | GET /products | لا يغير شيئًا |
| POST | إنشاء | POST /products | يرسل بيانات جديدة في الجسم |
| PUT | استبدال كامل | PUT /products/15 | يرسل الكائن كاملًا |
| PATCH | تعديل جزئي | PATCH /products/15 | حقول محددة فقط |
| DELETE | حذف | DELETE /products/15 | يحذف المورد |
شكل الطلب والرد
مثال طلب لقراءة منتج:
curl -s https://api.example.com/products/15 \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"والرد:
{
"id": 15,
"name": "سماعة لاسلكية",
"price": 899.5,
"inStock": true,
"tags": ["صوتيات", "لاسلكي"]
}وهذا طلب إنشاء:
curl -X POST https://api.example.com/products \
-H "Content-Type: application/json" \
-d '{"name":"ماوس","price":250}'أكواد الحالة: لغة الخادم في الرد
كل رد يحمل كود حالة يخبرك بما حدث. احفظ هذه العائلات:
- 2xx نجاح:
200 OKو201 Createdبعد الإنشاء و204 No Contentبعد الحذف. - 3xx تحويل:
301و304 Not Modified. - 4xx خطأ من العميل:
400 Bad Requestو401 Unauthorized(لم تسجل دخولك) و403 Forbidden(ليس لديك صلاحية) و404 Not Foundو422لبيانات غير صالحة و429 Too Many Requests. - 5xx خطأ من الخادم:
500و502و503.
استخدام الأكواد الصحيحة يجعل الواجهة سهلة الاستهلاك: لا تُرجع 200 مع رسالة «حدث خطأ» داخل الجسم.
استهلاك API من JavaScript
async function getProducts() {
const res = await fetch('https://api.example.com/products?limit=10');
if (!res.ok) throw new Error('HTTP ' + res.status);
return res.json();
}
async function createProduct(data) {
const res = await fetch('https://api.example.com/products', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data),
});
if (!res.ok) throw new Error('فشل الإنشاء: ' + res.status);
return res.json();
}لاحظ فحص res.ok قبل قراءة الجسم. وللتفاصيل الكاملة عن fetch راجع HTTP على MDN وتوثيق Fetch على MDN.
بناء API بسيط بـNode.js
import express from 'express';
const app = express();
app.use(express.json());
const products = [{ id: 1, name: 'لابتوب', price: 18000 }];
app.get('/products', (req, res) => res.json(products));
app.get('/products/:id', (req, res) => {
const p = products.find(x => x.id === Number(req.params.id));
if (!p) return res.status(404).json({ error: 'غير موجود' });
res.json(p);
});
app.post('/products', (req, res) => {
const { name, price } = req.body;
if (!name || typeof price !== 'number')
return res.status(422).json({ error: 'بيانات غير صالحة' });
const p = { id: products.length + 1, name, price };
products.push(p);
res.status(201).json(p);
});
app.listen(3000);هذا يعمل كنموذج تعليمي. في الإنتاج تستبدل المصفوفة بقاعدة بيانات (SQL أم NoSQL) وتضيف مصادقة وتحققًا وتسجيلًا للأخطاء.
المصادقة والحماية
الـAPI بلا حماية باب مفتوح. الأساسيات:
- HTTPS دائمًا حتى لا تُسرق البيانات في الطريق.
- المصادقة (Authentication): من أنت؟ عبر رمز Bearer أو JWT أو جلسات (Cookies) أو OAuth.
- التفويض (Authorization): ماذا يحق لك؟ تحقق من الصلاحيات في كل طلب وعلى مستوى المورد (لا تكتفِ بإخفاء الأزرار في الواجهة).
- التحقق من المدخلات على الخادم دائمًا. لا تثق بما يرسله العميل.
- تحديد المعدل (Rate Limiting) لمنع الإساءة والهجمات.
- عدم كشف تفاصيل الأخطاء الداخلية للعميل.
- إدارة المفاتيح: لا تضع مفاتيح سرية داخل كود الواجهة أو التطبيق؛ تُكشف بسهولة.
القائمة الأشهر للمخاطر في تطبيقات الويب هي OWASP، وقد لخصنا ما يهم أصحاب المواقع في قائمة أمان المواقع وللتطبيقات في أمان واختبار تطبيقات الموبايل.
أفضل ممارسات تصميم REST
- أسماء الموارد جمع واسم لا فعل:
/ordersوليس/getOrders. - تسلسل واضح:
/users/7/ordersللطلبات التابعة للمستخدم 7. - ترقيم الصفحات (Pagination):
?page=2&limit=20حتى لا تُرجع آلاف السجلات. - الفلترة والترتيب:
?category=phones&sort=-price. - إصدارات:
/v1/productsلتتمكن من التطوير دون كسر التطبيقات القديمة. - رسائل أخطاء موحدة بصيغة JSON ثابتة.
- توثيق بأداة مثل OpenAPI/Swagger ليفهمه فريقك والعملاء.
- التخزين المؤقت (Cache) لبيانات القراءة الثقيلة، فيخف الحمل وتزيد السرعة.
REST مقابل بدائل
- GraphQL: يطلب العميل الحقول التي يريدها بالضبط. مفيد للتطبيقات المعقدة بواجهات متعددة، لكنه يضيف تعقيدًا.
- gRPC: سريع بين الخدمات الداخلية.
- WebSockets: للتحديث اللحظي (دردشة، تتبع).
للمبتدئ وأغلب المشاريع التجارية يكفي REST ويغطي الحاجة بوضوح.
من الاستخدام في المشاريع الواقعية
في تطبيق موبايل لمتجر: الشاشة الرئيسية تستدعي GET /products، وصفحة المنتج GET /products/:id، والسلة POST /cart/items، والدفع POST /orders. نفس الـAPI يخدم موقع المتجر وتطبيق أندرويد وiOS ولوحة الإدارة، وهذا سبب اعتماد الأنظمة الحديثة على فصل الواجهة عن الخادم. وهذا ما نطبقه في المتاجر وأنظمة الإدارة وتطبيقات الموبايل.
أخطاء شائعة
- إرجاع
200دائمًا حتى عند الخطأ. - تنفيذ عمليات تعديل بـGET، فتتأثر بالتخزين المؤقت وتفتح ثغرات.
- عدم التحقق من الصلاحيات (يستطيع المستخدم تعديل بيانات غيره بتغيير الرقم في الرابط).
- ردود ضخمة بلا ترقيم صفحات.
- كشف مفاتيح سرية في كود الواجهة.
- عدم توثيق الواجهة فيضيع الوقت في التخمين.
أسئلة شائعة
- REST يعامل البيانات كموارد لها روابط، ويتعامل معها بأفعال HTTP قياسية.
- استخدم أكواد الحالة الصحيحة وصيغة JSON موحدة.
- تحقق من المدخلات والصلاحيات على الخادم، ولا تكشف المفاتيح السرية.
- رقّم الصفحات ووثّق الواجهة واجعلها بإصدارات.
أسئلة شائعة
ما الفرق بين API وREST API؟
الـAPI مفهوم عام لواجهة بين برنامجين، وREST أسلوب محدد لتصميم واجهات تعمل على HTTP.
هل أحتاج API لموقع بسيط؟
المواقع الثابتة لا تحتاجها. تحتاجها حين تكون هناك بيانات ديناميكية أو واجهات متعددة (ويب وموبايل).
ما الفرق بين PUT وPATCH؟
PUT يستبدل المورد كاملًا، وPATCH يعدل حقولًا محددة فقط.
هل JSON هو الصيغة الوحيدة؟
لا، لكنها الأشهر. توجد XML وغيرها، لكن JSON أخف وأسهل في الويب.
كيف أجرب API بدون كود؟
بأدوات مثل Postman أو Insomnia أو أمر curl من الطرفية.
خدمة مرتبطة: تصميم وبرمجة المواقع
تحتاج تنفيذ هذا الموضوع لمشروعك؟ احكيلي عن فكرتك واحصل على عرض سعر مجاني خلال 24 ساعة.
اعرف المزيد ←اقرأ أيضاً
قواعد البيانات SQL وNoSQL: كيف تختار الأنسب لموقعك أو تطبيقك
شرح مبسط لقواعد البيانات العلائقية وغير العلائقية، مقارنة PostgreSQL وMySQL وMongoDB وFirebase، تصميم الجداول والعلاقات، الفهارس، النسخ الاحتياطي.
HTML وCSS وJavaScript للمبتدئين: ماذا يفعل كل منها وكيف تبدأ بها
شرح مبسط لثلاثي الويب HTML وCSS وJavaScript مع أمثلة كود حقيقية، وكيف تتكامل معًا، وأخطاء المبتدئين، وتمرين تبني به أول صفحة تفاعلية متجاوبة مع الموبايل.
أمان واختبار تطبيقات الموبايل: قائمة تدقيق قبل الإطلاق تحميك من الأعطال والاختراق
كيف تختبر تطبيقك وتؤمّنه قبل النشر: أنواع الاختبار، الأجهزة والشبكات، تخزين البيانات الحساسة، الاتصال الآمن، المصادقة، حماية API، OWASP Mobile، الخصوصية.
كيف تتعلم البرمجة من الصفر؟ خارطة طريق عملية للمبتدئين
خارطة طريق لتعلم البرمجة من الصفر: اختيار المسار، أساسيات المنطق، أول مشروع، الأدوات، أخطاء المبتدئين، وجدول 6 أشهر للوصول إلى مستوى يؤهلك لأول فرصة عمل.