تطوير واجهات REST API

مقدمة إلى واجهات برمجة REST

20 دقيقة الدرس 1 من 35

ما هي واجهة برمجة REST؟

REST (نقل الحالة التمثيلية) هو نمط معماري لتصميم التطبيقات الشبكية. واجهة برمجة REST (واجهة برمجة التطبيقات) هي طريقة لتواصل التطبيقات البرمجية المختلفة مع بعضها البعض عبر الإنترنت باستخدام أساليب HTTP القياسية.

فكر في واجهة برمجة REST كنادل في مطعم. أنت (العميل) تخبر النادل (الواجهة البرمجية) بما تريده من القائمة (موارد الخادم)، والنادل يحضره لك. لا تحتاج إلى معرفة كيفية عمل المطبخ - تحتاج فقط إلى معرفة كيفية الطلب.

ملاحظة: واجهات برمجة REST هي العمود الفقري لتطبيقات الويب الحديثة. خدمات مثل تويتر وفيسبوك وخرائط جوجل وآلاف المنصات الأخرى تكشف وظائفها من خلال واجهات برمجة REST.

لماذا تهم واجهات برمجة REST

أصبحت واجهات برمجة REST المعيار لخدمات الويب لأنها تقدم عدة مزايا رئيسية:

  • البساطة: تستخدم أساليب HTTP المألوفة (GET، POST، PUT، DELETE) التي يفهمها المطورون بالفعل
  • قابلية التوسع: البنية عديمة الحالة تسمح بالتوسع الأفقي السهل
  • المرونة: يمكن إرجاع البيانات بتنسيقات متعددة (JSON، XML، HTML)
  • استقلالية المنصة: تعمل مع أي لغة برمجة أو منصة تدعم HTTP
  • فصل المخاوف: يمكن تطوير الواجهة الأمامية والخلفية بشكل مستقل

المبادئ الستة لـ REST

لكي تُعتبر واجهة برمجية متوافقة مع REST، يجب أن تتبع هذه القيود المعمارية:

1. معمارية العميل-الخادم

العميل والخادم كيانان منفصلان يتواصلان عبر الشبكة. يتعامل العميل مع واجهة المستخدم وتجربة المستخدم، بينما يدير الخادم تخزين البيانات ومنطق العمل. هذا الفصل يسمح لكليهما بالتطور بشكل مستقل.

العميل (React، Vue، تطبيق موبايل)
    ↓ طلب HTTP
الخادم (Node.js، PHP، Python)
    ↓ استجابة HTTP
العميل يستقبل ويعرض البيانات

2. عدم الحالة

يجب أن يحتوي كل طلب من العميل إلى الخادم على جميع المعلومات اللازمة لفهم الطلب ومعالجته. لا يخزن الخادم أي سياق للعميل بين الطلبات. كل طلب مستقل ومكتفٍ ذاتياً.

نصيحة: يتم تضمين رموز المصادقة (مثل JWT) في رأس كل طلب، مما يسمح للخادم بتحديد هوية المستخدم دون الحفاظ على حالة الجلسة.

3. إمكانية التخزين المؤقت

يجب أن تحدد الاستجابات نفسها على أنها قابلة للتخزين المؤقت أو غير قابلة للتخزين المؤقت. إذا كانت الاستجابة قابلة للتخزين المؤقت، يمكن للعميل إعادة استخدام بيانات تلك الاستجابة للطلبات المماثلة لاحقاً، مما يحسن الأداء ويقلل الحمل على الخادم.

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: max-age=3600

{
  "id": 1,
  "name": "أحمد محمد"
}

4. واجهة موحدة

تتبع واجهات برمجة REST نهجاً متسقاً وموحداً للتفاعل مع الموارد. يشمل ذلك:

  • تحديد المورد: يتم تحديد الموارد بواسطة URIs (مثل /users/123)
  • معالجة المورد: يتلاعب العملاء بالموارد من خلال التمثيلات (JSON، XML)
  • الرسائل الوصفية الذاتية: تتضمن كل رسالة معلومات كافية لوصف كيفية معالجتها
  • HATEOAS: تتضمن الاستجابات روابط للموارد ذات الصلة

5. نظام طبقي

لا يمكن للعميل معرفة ما إذا كان متصلاً مباشرة بالخادم النهائي أو وسيط. هذا يسمح بإضافة موازنات التحميل والوكلاء والبوابات بشكل شفاف.

6. الكود عند الطلب (اختياري)

يمكن للخوادم توسيع وظائف العميل مؤقتاً عن طريق نقل الكود القابل للتنفيذ (مثل JavaScript). هذا هو القيد الاختياري الوحيد.

أساليب HTTP: أفعال REST

تستخدم واجهات برمجة REST أساليب HTTP القياسية لإجراء العمليات على الموارد. فكر في هذه كأفعال تصف الإجراء الذي تريد تنفيذه:

الأسلوب الغرض مثال
GET استرجاع البيانات GET /users/123
POST إنشاء مورد جديد POST /users
PUT تحديث المورد بالكامل PUT /users/123
PATCH تحديث جزء من المورد PATCH /users/123
DELETE حذف المورد DELETE /users/123

رموز حالة HTTP: لغة الاستجابة

تخبر رموز الحالة العميل ما إذا كان طلبه ناجحاً وماذا حدث. يتم تجميعها في خمس فئات:

1xx - معلوماتي

تم استلام الطلب وجارٍ معالجته. نادراً ما تُرى في واجهات برمجة REST.

2xx - نجاح

  • 200 OK: نجح الطلب (GET، PUT، PATCH)
  • 201 Created: تم إنشاء مورد جديد بنجاح (POST)
  • 204 No Content: نجح الطلب ولكن لا يوجد محتوى للإرجاع (DELETE)

3xx - إعادة توجيه

  • 301 Moved Permanently: انتقل المورد بشكل دائم إلى عنوان URL جديد
  • 304 Not Modified: الإصدار المخزن مؤقتاً لا يزال صالحاً

4xx - أخطاء العميل

  • 400 Bad Request: بناء جملة أو معاملات طلب غير صالحة
  • 401 Unauthorized: المصادقة مطلوبة أو فشلت
  • 403 Forbidden: تم المصادقة ولكن غير مصرح
  • 404 Not Found: المورد غير موجود
  • 422 Unprocessable Entity: فشل التحقق
  • 429 Too Many Requests: تم تجاوز حد المعدل

5xx - أخطاء الخادم

  • 500 Internal Server Error: خطأ عام في الخادم
  • 503 Service Unavailable: الخادم غير متاح مؤقتاً
تحذير: لا ترجع أبداً رمز الحالة 200 OK عند حدوث خطأ. استخدم دائماً رمز الحالة المناسب لمساعدة العملاء على فهم ما حدث.

دورة الطلب-الاستجابة

فهم كيفية تدفق البيانات في واجهة برمجة REST أمر بالغ الأهمية. إليك ما يحدث في طلب واجهة برمجية نموذجي:

1. العميل يقوم بطلب HTTP
   → GET https://api.example.com/users/123
   → الرؤوس: Authorization، Content-Type، إلخ.

2. ينتقل الطلب عبر الإنترنت
   → قد يمر عبر الوكلاء وموازنات التحميل

3. الخادم يستقبل الطلب
   → يصادق على المستخدم
   → يتحقق من الطلب
   → يعالج منطق العمل

4. الخادم يعد الاستجابة
   → ينسق البيانات (عادةً JSON)
   → يضع رمز الحالة
   → يضيف الرؤوس

5. يتم إرسال الاستجابة إلى العميل
   → الحالة: 200 OK
   → الجسم: {"id": 123, "name": "أحمد"}

6. العميل يعالج الاستجابة
   → يحدث واجهة المستخدم
   → يخزن مؤقتاً إذا كان مناسباً

تشريح طلب واجهة برمجة REST

دعنا نحلل كيف يبدو طلب واجهة برمجية نموذجي:

GET /api/v1/users/123 HTTP/1.1
Host: api.example.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: application/json
Accept: application/json
User-Agent: MyApp/1.0

التحليل:

  • الأسلوب: GET - نحن نسترجع البيانات
  • المسار: /api/v1/users/123 - المورد الذي نريده
  • المضيف: api.example.com - عنوان الخادم
  • التفويض: رمز Bearer للمصادقة
  • نوع المحتوى: تنسيق البيانات التي نرسلها
  • القبول: التنسيق الذي نريد استقباله

تشريح استجابة واجهة برمجة REST

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: max-age=3600
X-RateLimit-Remaining: 999

{
  "id": 123,
  "name": "أحمد محمد",
  "email": "ahmed@example.com",
  "created_at": "2026-01-15T10:30:00Z",
  "links": {
    "self": "/api/v1/users/123",
    "posts": "/api/v1/users/123/posts"
  }
}

مكونات الاستجابة:

  • سطر الحالة: HTTP/1.1 200 OK
  • الرؤوس: البيانات الوصفية حول الاستجابة
  • الجسم: البيانات الفعلية (كائن JSON)
  • الروابط: الموارد ذات الصلة (HATEOAS)

REST مقابل الأساليب الأخرى

كيف تقارن REST بمعماريات واجهات برمجة أخرى؟

الجانب REST GraphQL SOAP
البروتوكول HTTP HTTP متعدد (HTTP، SMTP، إلخ.)
تنسيق البيانات JSON، XML، HTML JSON XML فقط
منحنى التعلم سهل متوسط شديد الانحدار
المرونة عالية عالية جداً منخفضة
نصيحة: REST مثالي لمعظم تطبيقات الويب وتطبيقات الموبايل. ضع في اعتبارك GraphQL عندما تحتاج إلى استعلامات مرنة، وSOAP لأنظمة المؤسسات التي تتطلب عقوداً صارمة وأمان عالٍ.

أمثلة واقعية لواجهات برمجة REST

دعنا ننظر إلى كيفية هيكلة الخدمات الشهيرة لواجهات برمجة REST الخاصة بها:

واجهة برمجة تويتر - الحصول على جدول المستخدم الزمني

GET https://api.twitter.com/2/users/123/tweets
Authorization: Bearer YOUR_TOKEN

الاستجابة: 200 OK
{
  "data": [
    {
      "id": "1234567890",
      "text": "مرحباً بالعالم!",
      "created_at": "2026-02-14T10:00:00Z"
    }
  ],
  "meta": {
    "result_count": 1,
    "next_token": "xyz789"
  }
}

واجهة برمجة GitHub - إنشاء مستودع

POST https://api.github.com/user/repos
Authorization: token YOUR_TOKEN
Content-Type: application/json

{
  "name": "my-new-repo",
  "description": "مشروعي الرائع",
  "private": false
}

الاستجابة: 201 Created
{
  "id": 123456,
  "name": "my-new-repo",
  "full_name": "username/my-new-repo",
  "html_url": "https://github.com/username/my-new-repo"
}
تمرين:

فكر في تطبيق تستخدمه يومياً (إنستغرام، سبوتيفاي، جيميل، إلخ). حدد ثلاث نقاط نهاية مختلفة قد تكون لديهم وما هي أساليب HTTP التي سيتم استخدامها:

  1. مثال: GET /users/{id}/posts - استرجاع منشورات المستخدم
  2. دورك: [اكتب إجابتك]
  3. دورك: [اكتب إجابتك]
  4. دورك: [اكتب إجابتك]

النقاط الرئيسية

  • REST هو نمط معماري، وليس بروتوكول أو معيار
  • يستخدم أساليب HTTP القياسية (GET، POST، PUT، PATCH، DELETE)
  • التصميم عديم الحالة يجعل واجهات برمجة REST قابلة للتوسع والصيانة
  • رموز الحالة تتواصل بشأن ما حدث مع الطلب
  • يتم تحديد الموارد بواسطة URIs ومعالجتها من خلال التمثيلات
  • واجهات برمجة REST مستقلة عن المنصة ومحايدة للغة

ما التالي؟

في الدرس التالي، سنتعمق أكثر في أساليب HTTP ورموز الحالة. ستتعلم بالضبط متى تستخدم كل أسلوب، وكيفية التعامل مع رموز الحالة المختلفة، وأفضل الممارسات لهيكلة استجابات واجهتك البرمجية.

تذكر: REST لا يتعلق بالكمال - بل يتعلق بالعملية واتباع الاتفاقيات التي تجعل واجهتك البرمجية سهلة الفهم والاستخدام. ركز على الاتساق والوضوح بدلاً من الالتزام الصارم بكل مبدأ من مبادئ REST.