مقدمة: REST API — أمر بسيط
REST API (Representational State Transfer) هي "اللغة" التي تتواصل بها البرامج المختلفة على الإنترنت. إذا كنت تريد أن يقوم تطبيق الويب الخاص بك بتقديم البيانات لتطبيق آخر (على سبيل المثال، تطبيق جوال أو واجهة أمامية React)، فأنت بحاجة إلى API. واليوم سنكتبه بلغة JavaScript (Node.js) من الصفر في 30 دقيقة فقط.
سنستخدم المكتبة الأكثر شهرة — Express. إنها بسيطة ومرنة ومثالية للمبتدئين. في نهاية المقال، سيكون لديك خادم عامل بأربع عمليات CRUD أساسية (إنشاء، قراءة، تحديث، حذف). هيا بنا!
الخطوة 1: تجهيز البيئة وتثبيت Express
قبل كتابة الكود، تأكد من تثبيت Node.js. يمكنك التحقق من ذلك في الطرفية:
node -vnpm -vإذا ظهرت الإصدارات — كل شيء جاهز. إذا لم تظهر، قم بتنزيل Node.js من الموقع الرسمي.
الآن، أنشئ مجلدًا للمشروع وقم بتهيئته:
mkdir my-first-apicd my-first-apinpm init -yتم إنشاء ملف package.json. نقوم بتثبيت Express ومكتبة UUID (لإنشاء معرفات فريدة):
npm install express uuidتم. أنشئ ملفًا باسم index.js — سيكون هذا الملف الرئيسي للخادم.
الخطوة 2: إنشاء خادم بسيط باستخدام Express
افتح index.js واكتب الإصدار الأول من الخادم:
const express = require('express');const app = express();const PORT = 3000;
// تحليل JSON من جسم الطلبapp.use(express.json());
// مسار اختباريapp.get('/', (req, res) => { res.send('مرحبًا بالعالم! REST API يعمل!');});
// تشغيل الخادمapp.listen(PORT, () => { console.log(`الخادم يعمل على http://localhost:${PORT}`);});قم بتشغيل الخادم باستخدام الأمر:
node index.jsافتح المتصفح وانتقل إلى العنوان http://localhost:3000. إذا رأيت رسالة الترحيب — كل شيء يعمل!
شرح الكود: express.json() هو middleware يقوم تلقائيًا بتحويل JSON من الطلب إلى كائن JavaScript. هذا ضروري لطلبات POST و PUT.
الخطوة 3: إضافة البيانات ومسارات CRUD
الآن الجزء الممتع — سننشئ مصفوفة من البيانات (في مشروع حقيقي، ستستخدم قاعدة بيانات، ولكن للتعلم، المصفوفة كافية). ستكون هذه قائمة بالكتب.
const { v4: uuidv4 } = require('uuid');
// محاكاة قاعدة بياناتlet books = [];
// إنشاء كتاب (POST)app.post('/api/books', (req, res) => { const { title, author } = req.body; if (!title || !author) { return res.status(400).json({ error: 'يجب تحديد العنوان والمؤلف' }); } const newBook = { id: uuidv4(), title, author }; books.push(newBook); res.status(201).json(newBook);});
// الحصول على جميع الكتب (GET)app.get('/api/books', (req, res) => { res.json(books);});
// الحصول على كتاب واحد حسب المعرف (GET)app.get('/api/books/:id', (req, res) => { const book = books.find(b => b.id === req.params.id); if (!book) { return res.status(404).json({ error: 'الكتاب غير موجود' }); } res.json(book);});
// تحديث كتاب (PUT)app.put('/api/books/:id', (req, res) => { const book = books.find(b => b.id === req.params.id); if (!book) { return res.status(404).json({ error: 'الكتاب غير موجود' }); } const { title, author } = req.body; if (title) book.title = title; if (author) book.author = author; res.json(book);});
// حذف كتاب (DELETE)app.delete('/api/books/:id', (req, res) => { const index = books.findIndex(b => b.id === req.params.id); if (index === -1) { return res.status(404).json({ error: 'الكتاب غير موجود' }); } books.splice(index, 1); res.status(204