ما هي أجزاء طلب HTTP؟
طلب HTTP هو طريقة (GET أو POST أو PUT أو PATCH أو DELETE …) وعنوان URL مستهدف — المسار مع معاملات الاستعلام — تليهما ترويسات، ولطرق حمل البيانات جسمٌ تسمّي ترويسة Content-Type صيغته. يعرّف RFC 9110 الطرق ودلالاتها: GET وHEAD آمنتان، وPUT وDELETE متكافئتان، وPOST ليست هذه ولا تلك، وهذا ما يقرر إن كان يجوز إعادة إرسال الطلب. وسطر أوامر cURL هو الطلب نفسه مكتوباً، وهو اللغة المشتركة لإعادة إنتاج استدعاء API في تقرير عيب.
اقرأ الدليل: ما هو اختبار API؟ وكيف تختبر REST API
كيفية استخدام مولّد أوامر cURL
- املأ الطريقة وعنوان URL والترويسات والمتن والمصادقة.
- اختر غلاف الأوامر (shell) الذي ستلصق فيه الأمر وفعّل الخيارات التي تحتاجها.
- انسخ الأمر؛ واقرأ شروحات العلامات إن كنت جديداً على curl.
مزايا مولّد أوامر cURL
- اقتباس صحيح لكل من bash/zsh وPowerShell (curl.exe مع علامات backtick) وWindows cmd (استمرار الأسطر بـ ^، وتهريب علامات الاقتباس، ومضاعفة %)
- مصادقة Bearer وBasic ومفتاح API كترويسات أو معاملات استعلام
- متون --data-raw، وخيارات -L و--compressed و-k و-i و-v و-sS و--max-time و-o
- يحذف -X POST الزائدة عند وجود متن، تماماً كما يتصرف curl
- شرح لكل علامة بلغة مبسطة أسفل الأمر
مثال على مولّد أوامر cURL
إرسال JSON عبر POST مع رمز (bash)
الإدخال:
POST https://api.example.com/v1/issues · Bearer ghp_… · Body {"title":"Fix login"} · --compressedالنتيجة:
curl https://api.example.com/v1/issues \
-H 'Authorization: Bearer ghp_…' \
-H 'Content-Type: application/json' \
--data-raw '{"title":"Fix login"}' \
--compressedالأسئلة الشائعة حول مولّد أوامر cURL
لماذا لا توجد -X POST في الأمر المولَّد؟
يتحوّل curl تلقائياً إلى POST عند وجود متن (-d / --data-raw)، لذا فإن -X POST زائدة. لا تُخرَج -X إلا للطرق الأخرى (PUT وPATCH وDELETE) أو لطلب POST دون متن.
ما الفرق بين مخرجات bash وPowerShell وcmd؟
يستخدم bash علامات اقتباس مفردة واستمرار الأسطر بالشرطة المائلة العكسية. ويستخدم PowerShell الأمر curl.exe (لأن «curl» اسم بديل لـ Invoke-WebRequest) مع استمرار الأسطر بـ backtick ومضاعفة علامات الاقتباس المفردة. أما cmd فلا يدعم علامات الاقتباس المفردة، لذا تُهرَّب علامات الاقتباس المزدوجة الداخلية على شكل \" وتستمر الأسطر بـ ^.
هل أستخدم -d أم --data-raw؟
يرسل --data-raw النص كما هو تماماً. أما مع -d فتُعامل القيمة التي تبدأ بـ @ على أنها اسم ملف — وهو أمر مفاجئ مع متون JSON. لذلك يستخدم المولّد --data-raw.
ما وظيفة --compressed؟
يضيف ترويسة Accept-Encoding لـ gzip/brotli ويفكّ ضغط الاستجابة تلقائياً، بما يطابق سلوك المتصفح ويقلّل حجم النقل.
ملاحظات تقنية
تُطابَق أسماء الترويسات مع قواعد token في RFC 9110، وتُرفض القيم الحاوية CR أو LF. ويُستنتج نوع المتن الخالي من Content-Type: كائن أو مصفوفة JSON تصبح application/json، وصيغة a=1&b=2 تصبح application/x-www-form-urlencoded، والبادئ بـ < يصبح application/xml، وما عدا ذلك text/plain. وتُدرج مصادقة Bearer وBasic ترويسة Authorization ما لم تُكتب واحدة يدوياً، وتُرمَّز بيانات Basic بـ UTF-8 قبل Base64. ويُلحق مفتاح API في سلسلة الاستعلام عبر encodeURIComponent، ولا يُعاد ترميز عنوان URL نفسه أبداً.
الاقتباس حسب الصدفة (shell): يترك bash القيم المطابقة لـ [A-Za-z0-9_-./:@=+%,] دون اقتباس، وإلا يحيطها بعلامات مفردة ويكتب المضمّنة منها '\''؛ ويستخدم PowerShell العلامات المفردة دائماً ويضاعف الداخلية؛ ويستخدم cmd العلامات المزدوجة ويهرّب \" ويضاعف % و^. وتبقى المتون متعددة الأسطر حرفية. تتحول HEAD إلى -I، ولا تظهر -X إلا للطرق غير GET وHEAD وPOST المصحوبة بمتن، وتُحدّ --max-time بـ 3600. وتُكبَّر أحرف الطريقة وتُجرَّد مما ليس حرفاً، فتمرّ أفعال مخصصة مثل PURGE.
المراجع
- RFC 9110: HTTP Semanticsمعاني أساليب HTTP وحقول الترويسات ورموز الحالة والتفاوض على المحتوى، بغضّ النظر عن إصدار البروتوكول.
- HTTP headers — MDNمرجع لترويسات الطلب والاستجابة: الصياغة والتوجيهات ودعم المتصفحات.
- RFC 7578: Returning Values from Forms: multipart/form-dataترميز multipart/form-data المستخدم لرفع الملفات وإرسال النماذج المختلطة.