كيف تحوّل طلب HTTP إلى أمر curl يعمل بأمان في صدفتك؟
اربط كل جزء من الطلب بخيار من خيارات curl — الرابط، و-X للطريقة التي لا يختارها curl بنفسه، و-H لكل ترويسة، و--data-raw للجسم — واستبعد ما يضبطه curl بنفسه مثل Content-Length وHost وترويسات القفزة الواحدة. ثم نصّص كل قيمة للصدفة التي ستشغّلها: علامات تنصيص مفردة في صدفة POSIX، وعلامات مزدوجة مُهرَّبة لـ PowerShell وcurl.exe، وهروب بعلامة ^ في cmd.exe، كي لا يتمدّد شيء في الترويسات أو الجسم ولا يُنفَّذ كشيفرة.
ملاحظة أمنية: يحمل الطلب المنسوخ من متصفحك كوكي الجلسة ورموز الدخول: فمن يشغّل الأمر يتصرف باسمك. احذفها أو أخفِها قبل لصق الأمر في تذكرة أو محادثة.
كيفية استخدام محوّل طلب HTTP إلى cURL
- الصق الطلب: من وسيط أو سجل، أو من أدوات المطوّر في المتصفح (لوحة Headers للطلب، أو Copy as fetch)، أو رابطاً فقط.
- اختر الصدفة التي ستشغّله فيها: Bash أو zsh، أو PowerShell، أو cmd.exe في Windows.
- حدّد «احذف ترويسة Cookie» و«أخفِ قيم Authorization» إن كان الأمر سيُشارك، وأضف --compressed أو -L أو -k عند الحاجة.
- انسخ أمر curl، واقرأ جدول الترويسات والملاحظات، ثم شغّله في الطرفية.
مزايا محوّل طلب HTTP إلى cURL
- يقرأ طلب HTTP/1.1 خاماً، أو ترويسات HTTP/2 الزائفة، أو كتلتي General وRequest Headers من أدوات المطوّر، أو مقتطف «Copy as fetch»، أو رابطاً مجرداً
- يكتب أمر curl لـ Bash أو zsh، أو لـ PowerShell (باسم curl.exe)، أو لـ cmd.exe في Windows، مع تنصيص كل قيمة بالطريقة التي تحتاجها تلك الصدفة
- يحافظ على الجسم كما هو بايتاً بايتاً عبر --data-raw، فلا يُقرأ رمز @ في أوله اسمَ ملف أبداً، ولا يفرض -X GET إلا حين يحمل طلب GET جسماً
- يستبعد ما يضبطه curl بنفسه أو ما قد يفسد الطلب — Host وContent-Length وConnection وTransfer-Encoding — ويذكر سبب كل منها
- يستطيع حذف ترويسة Cookie، وإخفاء قيم Authorization، وإضافة --compressed أو -L أو -k، وكتابة خيار واحد في كل سطر
- يذكر ما تغيّر ولماذا: https:// مفترض، أو الخيار -g لرابط فيه [ ] أو { }، أو جسم JSON مضغوط لـ cmd.exe، أو ترويسات استجابة استُبعدت من لصق أدوات المطوّر
المدخلات والمخرجات
المدخلات
- طلب HTTP أو ترويسات أدوات المطوّر أو استدعاء fetch() — الطلب نصاً حتى 2 ميغابايت؛ ويكتشف خيار «صيغة الإدخال» نوعه أو تختاره بنفسك.
- الصدفة والخيارات — Bash أو zsh أو PowerShell أو cmd.exe؛ وخيار واحد في كل سطر؛ و--compressed و-L و-k؛ وحذف ترويسة Cookie؛ وإخفاء قيم Authorization.
المخرجات
- أمر curl — جاهز للصق في الصدفة المختارة أو للنسخ أو التنزيل.
- الطلب — الطريقة والرابط وإصدار HTTP وكيف قُرئ النص الملصوق وحجم الجسم بالبايت والصدفة.
- الترويسات — كل ترويسة ملصوقة وهل هي في الأمر، أو مستبعدة (مع السبب)، أو مُضمَّنة بقيمة مخفية.
- ملاحظات على الأمر و«قبل أن تشغّله» — ما افترضه المحوّل أو غيّره، وما يحتويه الأمر.
مثال على محوّل طلب HTTP إلى cURL
طلب POST بصيغة JSON مع رمز دخول وكوكيز وفاصلة عليا في الجسم
الإدخال:
POST /api/v1/orders?expand=items HTTP/1.1 مع Host: shop.example.com وContent-Type وAccept: application/json وAuthorization: Bearer … وCookie: session=demo123; theme=dark وContent-Length: 45 وConnection: keep-alive والجسم {"sku":"TS-1042","quantity":2,"note":"Ali's"} (المثال المدمج في الأداة)، والصدفة Bash أو zshالنتيجة:
curl 'https://shop.example.com/api/v1/orders?expand=items' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJkZW1vIn0.demo-signature' \
-H 'Cookie: session=demo123; theme=dark' \
--data-raw '{"sku":"TS-1042","quantity":2,"note":"Ali'\''s"}'
الترويسات: Host — مستبعدة: يضبطها curl من الرابط · Content-Length — مستبعدة: يحسبها curl من الجسم · Connection — مستبعدة: ترويسة لكل قفزة، ويدير curl الاتصال بنفسه
ملاحظات على الأمر: لا يوجد بروتوكول في الطلب، فافتُرض https.كيف تقرأ نتائج محوّل طلب HTTP إلى cURL
«مستبعدة» في جدول الترويسات أمر مقصود: يحسب curl قيمتي Content-Length وHost بنفسه، ويدير Connection، ويضبط Accept-Encoding حين يكون --compressed مفعّلاً. أعد إضافة إحداها بـ -H فقط إن احتجت فعلاً قيمة مختلفة.
الملاحظة التي تقول إن https افتُرض تعني أن النص الملصوق بلا بروتوكول؛ غيّر الرابط في الأمر إلى http:// إن كانت الخدمة تعمل بـ HTTP عادي.
ملاحظة PowerShell عن الإصدار 7.3 ليست خطأ: ففي 7.3 وما بعده يمرّر PowerShell الوسائط بطريقة مختلفة، والأمر منصَّص وفق القواعد الأقدم.
ملاحظة ضغط الجسم لـ cmd.exe تعني أن فواصل الأسطر حُذفت بين رموز JSON فقط، وأن كل قيمة بقيت كما كُتبت.
متى تستخدم محوّل طلب HTTP إلى cURL
- إعادة إنتاج طلب فاشل من أدوات المطوّر أو من سجل وسيط في الطرفية، لمشاركته في بلاغ خلل.
- تحويل مقتطف «Copy as fetch» إلى أمر يعمل في CI أو على خادم بلا متصفح.
- نقل طلب بين أنظمة التشغيل: الطلب نفسه منصَّصاً لـ Bash وPowerShell وcmd.exe.
- تجهيز أمر قابل للمشاركة بعد حذف الكوكيز وإخفاء قيم Authorization.
استكشاف الأخطاء وإصلاحها
- «لم يُعثر على سطر طلب»: يبدأ النص الملصوق بغير METHOD /path أو :method: أو Request URL:. انسخ الطلب من سطره الأول، أو اختر «استدعاء fetch()» إن كان مقتطف fetch.
- «لم يُعثر على مضيف»: سطر الطلب يحمل مساراً فقط ولا توجد ترويسة Host. أضف Host: متبوعة باسم الخادم، أو الصق رابطاً مطلقاً في سطر الطلب.
- رُفض مقتطف fetch(): تستخدم خياراته متغيرات أو دوال أو FormData أو قالباً نصياً. الصق بدلاً منه الطلب الخام من لوحة Headers في أدوات المطوّر.
- يفشل الأمر في PowerShell 7.3 أو ما بعده بأخطاء تنصيص: شغّل أولاً $PSNativeCommandArgumentPassing = "Legacy"، أو استخدم صيغة Bash في WSL أو Git Bash.
الأسئلة الشائعة حول محوّل طلب HTTP إلى cURL
ما الصيغ التي يفهمها المحوّل؟
طلب HTTP/1.1 خام (سطر الطلب ثم الترويسات ثم سطر فارغ ثم الجسم)، وسطر طلب برابط مطلق، وترويسات HTTP/2 الزائفة (:method و:path و:authority و:scheme)، وكتلة General من أدوات المطوّر تليها ترويسات الطلب (وتُتخطّى ترويسات الاستجابة)، واستدعاء fetch(url, { … }) خياراته قيم حرفية، ورابطاً مجرداً يصبح طلب GET.
لماذا يستدعي أمر PowerShell البرنامج curl.exe؟
لأن كلمة curl في Windows PowerShell 5.1 اسم مستعار لـ Invoke-WebRequest الذي يأخذ خيارات مختلفة، فيسمّي الأمر curl.exe صراحةً. وتنصيصه مكتوب لـ Windows PowerShell 5.1 ولـ PowerShell من 7.0 إلى 7.2؛ أما في 7.3 وما بعده فاضبط أولاً $PSNativeCommandArgumentPassing = "Legacy" كما تذكر النتيجة.
هل من الآمن لصق طلب يحمل رمز الدخول أو الكوكيز الخاصة بي؟
يجري التحويل داخل متصفحك ولا يُرسل شيء. لكن الأمر نفسه يحتوي كل ترويسة لصقتها، فمن يشغّله يتصرف باسمك. حدّد «احذف ترويسة Cookie» و«أخفِ قيم Authorization» قبل مشاركته.
لماذا تغيب بعض الترويسات عن الأمر؟
لأن curl يضبط بعضها بنفسه أو لأنها قد تفسد الطلب: Content-Length (يحسبها من الجسم)، وHost حين تطابق مضيف الرابط، وترويسات القفزة الواحدة مثل Connection وTransfer-Encoding، وAccept-Encoding حين يكون --compressed مفعّلاً، والأسماء التي ليست رموزاً صالحة لترويسة. ويذكر جدول الترويسات كلاً منها مع السبب.
لماذا يبدو أمر cmd.exe مختلفاً إلى هذا الحد؟
لأن cmd.exe لا يعرف الهروب بالشرطة المائلة العكسية، ويمدّد %NAME% حتى داخل علامات التنصيص، ولا يستطيع تمرير فاصل أسطر داخل وسيط. لذلك تُهرَّب المحارف الخاصة بـ ^، ويُعطَّل كل %، ويُضغط جسم JSON متعدد الأسطر في سطر واحد دون تغيير قيمه، وتُحذف فواصل الأسطر من الأجسام الأخرى مع ملاحظة.
ملاحظات تقنية
يتكوّن طلب HTTP/1.1 من سطر الطلب وحقول الترويسات وسطر فارغ ثم الجسم (RFC 9112)؛ وقد يكون الهدف مساراً مع المضيف في ترويسة Host، أو رابطاً مطلقاً. ويحمل HTTP/2 الأجزاء نفسها في الترويسات الزائفة :method و:scheme و:authority و:path (RFC 9113 §8.3)، وهي ما تعرضه المتصفحات لطلبات HTTP/2. وإن غاب البروتوكول افترض المحوّل https وصرّح بذلك.
تُبقي صدفات POSIX (IEEE Std 1003.1، لغة أوامر الصدفة §2.2) كل ما بين علامتي التنصيص المفردتين حرفياً، فتُكتب علامة التنصيص المفردة هكذا '\'' — إغلاق ثم علامة مُهرَّبة ثم فتح. أما PowerShell فيمدّد $ وعلامة ` داخل علامات التنصيص المزدوجة فتُهرَّبان، ثم يقرأ curl.exe الوسيط وفق قواعد مكتبة C من Microsoft، ولهذا تصبح علامات التنصيص \`". ولا يعرف cmd.exe الهروب داخل علامات التنصيص ويمدّد %NAME% في كل مكان، فتُهرَّب المحارف الخاصة بـ ^ ويُعطَّل كل %.
يرسل curl محتوى --data-raw جسماً للطلب كما هو تماماً، ويضبط Content-Length بنفسه، وينتقل إلى POST حين يوجد جسم (فيحتاج GET ذو الجسم إلى -X GET)، ويجعل -I طلب HEAD. وتُستبعد الترويسات التي ليس اسمها رمزاً وفق RFC 9110، وترويسات القفزة الواحدة مثل Connection وTransfer-Encoding، لأن curl يدير الاتصال بنفسه. ويقرأ curl أيضاً [ ] و{ } في الرابط نطاقاتٍ وقوائم (ما يسمّيه URL globbing)، لذا يضيف المحوّل الخيار -g (--globoff) كلما احتواها الرابط، فيُرسل الرابط كما كُتب.
الحدود ومنهجية القياس
لا يرسل المحوّل الطلب أبداً: ويتوقف نجاح الأمر على الخادم وشبكتك وعلى ما لم يتضمنه النص الملصوق، كالكوكيز التي يضبطها JavaScript أو جلسة انتهت صلاحيتها.
لا يُعاد بناء رفع النماذج متعدد الأجزاء والأجسام الثنائية والملفات كخيارات -F أو @file، بل يُمرَّر الجسم نصاً عبر --data-raw.
لا تُقرأ مقتطفات fetch() إلا إذا كان رابطها وخياراتها قيماً حرفية؛ فالمتغيرات وFormData والقوالب النصية لا يمكن تقييمها.
لا يستطيع cmd.exe تمرير فواصل الأسطر داخل وسيط، ويعالج النص غير ASCII عبر صفحة ترميز الطرفية، فتُسطَّح الأجسام متعددة الأسطر وقد يحتاج النص غير ASCII إلى chcp 65001.
الأمان والخصوصية
يجري التحويل داخل متصفحك: لا يُرسل الطلب ولا رموزه ولا كوكيزه ولا تُخزَّن. لكن الأمر الذي تنسخه يحتويها ما لم تحذفها، فتعامل معه ككلمة مرور.
المراجع
- curl(1) — Linux manual pageكل خيارات curl: -X و-H و--data-raw و--data-binary و-I و-L و-k و--compressed، وكيف يختار curl الطريقة من الخيارات.
- Shell Command Language (IEEE Std 1003.1-2024)قواعد صدفة POSIX، ومنها §2.2 عن التنصيص: لماذا يبقى كل ما بين علامتي التنصيص المفردتين حرفياً، وكيف تُكتب علامة التنصيص المفردة نفسها.
- RFC 9112: HTTP/1.1صياغة رسائل HTTP/1.1: سطر الطلب وحقول الترويسات والنقل المجزّأ ومعالجة الاتصال.