مقدمة: لماذا من المهم معرفة نوع الطلب الذي يصل إلى الخادم؟
\n\nتخيل أنك حارس أمن في مبنى راقٍ. يأتي إليك أشخاص مختلفون: البعض يريد فقط مشاهدة قائمة السكان (GET)، وآخرون يريدون إضافة ساكن جديد (POST)، وفريق ثالث يريد تحديث البيانات (PUT)، ورابع يريد حذف سجل (DELETE). إذا خلطت بين المهام، سيحدث فوضى عارمة. نفس الشيء يحدث في PHP عندما تبني تطبيق ويب حديث أو REST API.
\n\nسؤال "كشف نوع الطلب في PHP (GET, POST, PUT or DELETE)" هو من أكثر الأسئلة شيوعاً على Stack Overflow (آلاف المشاهدات). وهذا ليس من قبيل الصدفة. المبتدئون غالباً ما يكتبون: if ($_POST) ويصطدمون بأخطاء عند وصول طلب PUT أو DELETE. اليوم سنحسم الأمر نهائياً ونتعلم كيفية تحديد طريقة طلب HTTP في PHP بشكل احترافي، ليكون كودك متيناً وموثوقاً.
المقالة مكتوبة للموقع التعليمي PythonLib، لكن الموضوع عالمي. هيا بنا!
\n\nما هي طرق HTTP ولماذا يجب التمييز بينها؟
\nHTTP هو البروتوكول الذي يتواصل من خلاله المتصفح (أو العميل) مع الخادم. كل طلب يحمل طريقة (فعل) تخبر الخادم بما يجب فعله بالضبط:
\n- \n
- GET — جلب البيانات (قراءة). آمن، وغير مؤثر على الحالة. \n
- POST — إرسال البيانات (إنشاء مورد جديد). \n
- PUT — استبدال المورد بالكامل (تحديث). \n
- DELETE — حذف المورد. \n
- PATCH — تحديث جزئي (أقل استخداماً). \n
في نماذج HTML التقليدية، يدعم المتصفح GET و POST فقط. لكن في REST API (مثل تطبيقات الجوال أو AJAX) تُستخدم جميع الطرق بنشاط. إذا كنت تكتب خلفية (باك إند) متعددة الاستخدامات، يجب أن تكون قادراً على التمييز بينها.
\n\nالأداة الأهم: $_SERVER['REQUEST_METHOD']
\nفي PHP، جميع معلومات الطلب مخزنة في المصفوفة الشاملة $_SERVER. المفتاح REQUEST_METHOD يحتوي على نص اسم الطريقة: 'GET'، 'POST'، 'PUT'، 'DELETE'، إلخ.
إليك مثال أساسي:
\n<?php\n$method = $_SERVER['REQUEST_METHOD'];\necho "نوع الطلب: " . $method;\n?>\nشغّل هذا الكود على خادمك. إذا فتحت الصفحة في المتصفح — سترى GET. إذا أرسلت نموذجاً بـ method="POST" — سترى POST. الأمر في غاية البساطة.
لكن هذه مجرد البداية. دعنا نتعمق في كيفية بناء المنطق الصحيح بناءً على الطريقة.
\n\nمثال عملي: موجه (Router) لـ REST API
\nلنفترض أننا نكتب API بسيطاً لإدارة قائمة المهام (to-do list). لدينا نقطة نهاية واحدة — /api/tasks. بناءً على طريقة الطلب، نقوم بإجراءات مختلفة:
- \n
- GET — إرجاع قائمة بجميع المهام. \n
- POST — إنشاء مهمة جديدة. \n
- PUT — تحديث مهمة موجودة (استبدال كامل). \n
- DELETE — حذف مهمة. \n
إليك كيف يبدو ذلك في الكود:
\n<?php\n// تحديد طريقة الطلب\n$method = $_SERVER['REQUEST_METHOD'];\n\n// التوجيه (Routing)\nswitch ($method) {\n case 'GET':\n // معالجة طلب GET\n echo "عرض قائمة المهام...";\n // هنا منطق جلب البيانات من قاعدة البيانات\n break;\n\n case 'POST':\n // معالجة طلب POST\n echo "إنشاء مهمة جديدة...";\n // $_POST يحتوي على بيانات النموذج\n $title = $_POST['title'] ?? '';\n // منطق الحفظ في قاعدة البيانات\n break;\n\n case 'PUT':\n // معالجة طلب PUT\n echo "تحديث المهمة...";\n // هام: بيانات PUT لا تصل إلى $_POST!\n // يجب قراءتها من php://input\n $pu