سحر النقرة الواحدة: كيف يتحول Postman إلى Curl؟
\n\nكل من عمل مع API يعرف هذا الموقف: لقد أعددت طلبًا مثاليًا في Postman، كل شيء يعمل كالساعة، ثم تحتاج إلى نقل هذا الطلب إلى زميل أو تضمينه في سكريبت PHP. تضغط على "Code" ← تختار cURL ← وتحصل على الأمر الجاهز. سحر؟ لا، إنها رياضيات بحتة وتحليل.
\n\nولكن ماذا لو كنت بحاجة إلى أتمتة هذه العملية؟ أو كتابة محول خاص بك يحول وصف الطلب بصيغة JSON إلى أمر curl قابل للتنفيذ؟ اليوم سنلقي نظرة تحت غطاء هذه الآلية ونكتب دالة PHP تفعل نفس الشيء الذي يفعله Postman - ولكن بأيدينا.
هذه المادة ستكون مفيدة ليس فقط لمطوري الواجهة الخلفية، ولكن لكل من يريد فهمًا أعمق لكيفية عمل طلبات HTTP وكيفية تحويلها من تنسيق إلى آخر. هيا بنا!
\n\nما هو "Postman to Curl" في الحقيقة؟
\n\nعندما تضغط على زر التصدير في Postman، يقوم البرنامج بشيء بسيط ولكنه مهم: فهو يأخذ وصفًا منظمًا للطلب (الطريقة، URL، الرؤوس، الجسم) ويترجمه إلى صيغة سطر الأوامر.
\n\nفي جوهره، هذا هو تحويل الطلب من تمثيل إلى آخر. يخزن Postman الطلبات في نموذج JSON الداخلي الخاص به. عندما تختار cURL، يقوم بالتكرار عبر هذا النموذج ويجمع سطرًا مثل:
\n\ncurl --request POST \\\n --url https://api.example.com/data \\\n --header 'Content-Type: application/json' \\\n --data '{"key":"value"}'\n\nكل شيء عبقري بسيط. لكن دعنا نحلل كيف يعمل هذا على مستوى الكود.
\n\nإنشاء المحول الخاص بنا في PHP
\n\nسنكتب كلاس PostmanToCurl يستقبل مصفوفة ترابطية تحتوي على معاملات الطلب ويعيد سلسلة نصية تحتوي على أمر curl جاهز. سيكون هذا محرك التحويل المصغر الخاص بنا.
الخطوة 1: تحديد هيكل البيانات المدخلة
\n\nللبساطة، سنتفق على أننا سنستقبل مصفوفة تحتوي على المفاتيح: method و url و headers (مصفوفة ترابطية) و body (سلسلة نصية أو مصفوفة). هذا هو النموذج الأدنى الذي يستخدمه Postman.
<?php\n\n$request = [\n 'method' => 'POST',\n 'url' => 'https://api.example.com/users',\n 'headers' => [\n 'Content-Type' => 'application/json',\n 'Authorization' => 'Bearer token123'\n ],\n 'body' => json_encode(['name' => 'John', 'email' => 'john@example.com'])\n];\n\nالخطوة 2: كتابة دالة التجميع
\n\nالمنطق الأساسي: نأخذ الطريقة، URL، الرؤوس، الجسم - ونلصقهم معًا في أمر واحد. انتبه إلى هروب علامات الاقتباس والأحرف الخاصة.
\n\nfunction generateCurlCommand(array $request): string {\n $parts = ['curl'];\n\n // 1. الطريقة (إذا لم تكن GET)\n if (strtoupper($request['method']) !== 'GET') {\n $parts[] = '--request ' . strtoupper($request['method']);\n }\n\n // 2. URL\n $parts[] = '--url ' . escapeshellarg($request['url']);\n\n // 3. الرؤوس\n foreach ($request['headers'] as $key => $value) {\n $parts[] = '--header ' . escapeshellarg($key . ': ' . $value);\n }\n\n // 4. جسم الطلب\n if (!empty($request['body'])) {\n $parts[] = '--data ' . escapeshellarg($request['body']);\n }\n\n return implode(" \\\\\\n ", $parts);\n}\n\nدالة escapeshellarg هي أفضل صديق لك. تقوم بهروب علامات الاقتباس بشكل صحيح، مما يمنع كسر الأمر واحتمالية حدوث ثغرات.
تحليل تحت الغطاء: ماذا يفعل Postman في الحقيقة
\n\nالآن بعد أن أصبح لدينا كود عملي، دعنا نحلل بالضبط كيف يعالج Postman (والمحول الخاص بنا) كل عنصر من عناصر الطلب.
\n\n1. طريقة HTTP
\nيتحقق Postman مما إذا كانت الطريقة تختلف عن GET. إذا كانت مختلفة، يضيف العلم --request. لماذا ليس لـ GET؟ لأن cURL يقوم افتراضيًا بطلب GET إذا لم يتم تحديد خلاف ذلك. ذك