مقدمة: لماذا نحتاج إلى عميل HTTP بلغة PHP؟
\n\nتطوير الويب الحديث لا يمكن تصوره بدون التفاعل مع الخدمات الخارجية. سواء كان إرسال البيانات إلى API خارجي، أو الحصول على أسعار العملات، أو التكامل مع بوابة الدفع - كل مطور PHP يواجه الحاجة إلى تنفيذ طلبات HTTP. إن إنشاء عميل HTTP موثوق بلغة PHP هو كفاءة أساسية تتيح لتطبيقك التواصل مع بقية العالم.
\n\nفي هذه المقالة، سنستعرض نهجين رئيسيين: استخدام إضافة cURL المدمجة ومكتبة Guzzle الشهيرة. ستتعلم كيفية إرسال طلبات GET و POST و PUT و DELETE بشكل صحيح، ومعالجة الأخطاء، والعمل مع الرؤوس. ستكون المادة مفيدة لكل من المبتدئين والمطورين ذوي الخبرة الذين يرغبون في تنظيم معرفتهم.
\n\n1. أساسيات عميل HTTP بلغة PHP: العمل مع cURL
\n\n1.1. ما هو cURL ولماذا هو مهم
\n\ncURL (Client URL Library) هي إضافة قوية للغة PHP تتيح التفاعل مع خوادم مختلفة عبر بروتوكولات HTTP و HTTPS و FTP وغيرها. وهي مضمنة في التوزيعة القياسية لـ PHP، ولكنها قد تتطلب تفعيلًا منفصلًا في ملف php.ini. تمنحك cURL تحكمًا كاملاً في الطلب: يمكنك تعيين أي طريقة، ورؤوس، ونص الطلب، ومهلات زمنية.
\n\n1.2. طلب GET بسيط باستخدام cURL
\n\nلنبدأ بأكثر السيناريوهات شيوعًا - الحصول على البيانات من الخادم. لنلقِ نظرة على مثال لطلب إلى API العام JSONPlaceholder:
\n\n<?php\n// تهيئة جلسة cURL\n$ch = curl_init('https://jsonplaceholder.typicode.com/posts/1');\n\n// إعداد الخيارات\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\ncurl_setopt($ch, CURLOPT_HTTPGET, true);\ncurl_setopt($ch, CURLOPT_TIMEOUT, 30);\n\n// تنفيذ الطلب\n$response = curl_exec($ch);\n$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\n\n// التحقق من الأخطاء\nif (curl_errno($ch)) {\n echo 'خطأ cURL: ' . curl_error($ch);\n} else {\n echo "كود HTTP: $httpCode\\n";\n $data = json_decode($response, true);\n print_r($data);\n}\n\n// إغلاق الجلسة\ncurl_close($ch);\n?>\n\nلاحظ: نتحقق دائمًا من كود الاستجابة ووجود الأخطاء. يضمن CURLOPT_RETURNTRANSFER إرجاع النتيجة إلى متغير بدلاً من عرضها مباشرة.
1.3. إرسال طلب POST مع البيانات
\n\nلإرسال البيانات إلى الخادم (على سبيل المثال، عند إنشاء سجل جديد) نستخدم POST. يمكن تمرير البيانات كمصفوفة أو سلسلة JSON:
\n\n<?php\n$ch = curl_init('https://jsonplaceholder.typicode.com/posts');\n\n$postData = [\n 'title' => 'منشور جديد',\n 'body' => 'محتوى المنشور',\n 'userId' => 1\n];\n\ncurl_setopt_array($ch, [\n CURLOPT_RETURNTRANSFER => true,\n CURLOPT_POST => true,\n CURLOPT_POSTFIELDS => json_encode($postData), // JSON\n CURLOPT_HTTPHEADER => [\n 'Content-Type: application/json',\n 'Accept: application/json'\n ],\n CURLOPT_TIMEOUT => 30\n]);\n\n$response = curl_exec($ch);\n$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\ncurl_close($ch);\n\necho "كود HTTP: $httpCode\\n";\necho $response;\n?>\n\nالنقطة الأساسية: إذا قمت بتمرير مصفوفة إلى CURLOPT_POSTFIELDS، فسيقوم PHP تلقائيًا بتشفيرها كـ application/x-www-form-urlencoded. بالنسبة لـ JSON، يجب استخدام json_encode() وتحديد الرأس Content-Type بشكل صريح.
1.4. طلبات PUT و DELETE
\n\nلتحديث وحذف الموارد، يتم استخدام طريقتي PUT و DELETE. في cURL، يتم تعيينهما عبر الخيار CURLOPT_CUSTOMREQUEST:
<?php\n// طلب PUT (تحديث)\n$ch = curl_init('https://jsonplaceholder.typicode.com/posts/1');\n$updateData = ['title' => 'عنوان محدث'];\n\ncurl_setopt_array($ch, [\n CURLOPT_RETURNTRANSFER => true,\n CURLOPT_CUSTOMREQUEST => 'PUT',\n CURLOPT_POSTFIELDS => json_encode($updateData),\n CURLOPT_HTTPHEADER =>