HTTP: لغة المتصفح والخادم
درس 3 من 3
3HTTP: لغة المتصفح والخادم
الصورة الكبيرةكل صورة وكل زر «إعجاب» وكل تسجيل دخول هو طلب HTTP ورد. حين تفهم هذا الحوار تفهم الويب كله.
ماذا تشاهد في الرسم: طلب واحد ورد واحد. الطلب يقول «ماذا أريد»، والرد يبدأ برمز يقول «كيف جرى» ثم المحتوى.
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
مثل طلب في مطعم: تقول للنادل «أريد قائمة الطعام» (GET) أو «سجّل طلبي» (POST). يعود ويقول «تفضّل» (200) أو «هذا الطبق غير موجود» (404) أو «المطبخ تعطّل» (500). والنادل لا يتذكّرك، فتعطيه رقم طاولتك كل مرة (الكوكي).
HTTP/1.1 بروتوكول نصّي عديم الحالة: سطر الطلب (الفعل، المسار، النسخة)، ترويسات (Host، Content-Type، Authorization، Cookie)، سطر فارغ، ثم الجسم. الأفعال لها دلالات: GET آمن ومتكرّر النتيجة (idempotent)، PUT وDELETE متكرّرا النتيجة، POST ليس كذلك. الرموز: 2xx نجاح، 3xx تحويل، 4xx خطأ العميل، 5xx خطأ الخادم. HTTP/2 و3 يغيّران النقل (تعدد الإرسال، QUIC فوق UDP) لا الدلالات.
قبل أن تبدأ
🧭من الرابط إلى الصفحة
تعرف أجزاء الرابط ورحلة DNS.
الفكرة الجوهرية
1شكل الطلب والرد
الطلب والرد نص تقرؤه بعينك. هذا المثال يبني طلبًا ثم يقرأ ردًّا ويفكّكه، بلا شبكة، حتى ترى كل سطر.
request = (
"GET /menu?lang=ar HTTP/1.1\r\n"
"Host: cafe.example\r\n"
"Accept: application/json\r\n"
"\r\n"
)
print(request.splitlines()[0])
reply = 'HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n{"items": 3}'
head, body = reply.split("\r\n\r\n", 1)
status = head.splitlines()[0].split(" ", 2)
print("code:", status[1], "| reason:", status[2])
print("body:", body)2الأفعال: ماذا تريد أن تفعل
GET اقرأ، POST أنشئ، PUT استبدل، PATCH عدّل جزءًا، DELETE احذف. فتح صفحة GET، وإرسال نموذج تسجيل غالبًا POST. لا تغيّر بيانات بـ GET أبدًا، لأن المتصفحات ومحركات البحث تكرّره بحرية.
3رموز الحالة
الرقم الأول يحكي القصة: 2xx تمام (200 OK، 201 أُنشئ)، 3xx اذهب لمكان آخر (301، 302)، 4xx الخطأ منك (400 طلب معيب، 401 سجّل دخولك، 403 ممنوع، 404 غير موجود)، 5xx الخطأ من الخادم (500، 503).
from http import HTTPStatus
for code in [200, 201, 301, 401, 403, 404, 500, 503]:
s = HTTPStatus(code)
print(code, s.phrase, "->", ["", "info", "success", "redirect", "client error", "server error"][code // 100])4الترويسات والكوكيز
الترويسات معلومات عن الطلب: نوع المحتوى (Content-Type)، اللغة المفضّلة، من أنت (Authorization). وHTTP ينسى كل شيء بين طلبين، فبعد تسجيل الدخول يرسل الخادم Set-Cookie، والمتصفح يعيده في كل طلب تالٍ فيعرف الخادم أنك أنت.
مثال محلول
المسألة: تطبيق مهام. ما الطلب لكل عملية؟ الحل: عرض المهام GET /tasks ← 200. إضافة مهمة POST /tasks بجسم JSON ← 201. وضع علامة «تمت» PATCH /tasks/7 ← 200. حذف DELETE /tasks/7 ← 204. طلب مهمة غير موجودة GET /tasks/999 ← 404. طلب بلا تسجيل دخول ← 401.
خرافة مقابل حقيقة
| الخرافة | الحقيقة |
|---|---|
| HTTPS لغة مختلفة عن HTTP. | نفس HTTP بالضبط، لكن داخل نفق TLS مشفّر. |
| الخادم يتذكّرك تلقائيًا. | HTTP عديم الحالة. الكوكي أو الرمز في كل طلب هو ما يجعله «يتذكّر». |
اختبر فهمك
أرسلت نموذجًا وظهر 500. خطأ من؟
5xx تعني أن الخادم فشل في معالجة طلب قد يكون سليمًا.
أي فعل مناسب لإنشاء حساب جديد؟
POST ينشئ موردًا جديدًا، وغالبًا يرد 201.
سجّلت دخولك لكن صفحة الإدارة تعطي 403. ماذا يعني؟
403 بعد تسجيل الدخول تعني نقص صلاحية لا نقص هوية.
بطاقات مراجعة سريعة
تحقق من فهمك
لماذا لا نحذف بيانات بطلب GET؟
لأن GET يُفترض آمنًا، فالمتصفحات والبحث والتخزين المؤقت قد تكرّره، فتُحذف البيانات بلا قصد.
ما الفرق بين 401 و403؟
401 هويتك غير معروفة. 403 هويتك معروفة وليس لك صلاحية.
كيف «يتذكّر» الموقع أنك سجّلت دخولك؟
بكوكي يحمل معرّف جلسة يرسله المتصفح مع كل طلب، والخادم يربطه بحسابك.
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
توثيق رسمي2
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.