HTTP रिक्वेस्ट को ऐसी curl कमांड में कैसे बदलें जो आपके शेल में सुरक्षित चले?
रिक्वेस्ट के हर हिस्से को curl के विकल्प से जोड़ें — URL, जो मेथड curl ख़ुद न चुने उसके लिए -X, हर हेडर के लिए -H, बॉडी के लिए --data-raw — और जो curl ख़ुद सेट करता है उसे छोड़ दें, जैसे Content-Length, Host और hop-by-hop हेडर। फिर हर मान को चलाने वाले शेल के लिए quote करें: POSIX शेल में single quote, PowerShell और curl.exe के लिए escape किए double quote, cmd.exe में ^ से escape, ताकि हेडर या बॉडी में कुछ भी expand न हो या कोड की तरह न चले।
सुरक्षा नोट: ब्राउज़र से कॉपी की गई रिक्वेस्ट में आपकी सेशन कुकी और टोकन होते हैं: जो भी कमांड चलाए वह आपके नाम से काम करता है। कमांड को टिकट या चैट में डालने से पहले इन्हें हटाएँ या छिपाएँ।
HTTP रिक्वेस्ट से cURL कन्वर्टर कैसे इस्तेमाल करें
- रिक्वेस्ट पेस्ट करें: प्रॉक्सी या लॉग से, ब्राउज़र के डेवलपर टूल्स से (रिक्वेस्ट का Headers पैनल, या Copy as fetch), या बस एक URL।
- वह शेल चुनें जिसमें आप इसे चलाएँगे: Bash या zsh, PowerShell या Windows cmd.exe।
- कमांड शेयर होनी है तो "Cookie हेडर हटाएँ" और "Authorization के मान छिपाएँ" चुनें, और ज़रूरत हो तो --compressed, -L या -k जोड़ें।
- curl कमांड कॉपी करें, हेडर तालिका और नोट्स पढ़ें, फिर टर्मिनल में चलाएँ।
HTTP रिक्वेस्ट से cURL कन्वर्टर की खूबियाँ
- Raw HTTP/1.1 रिक्वेस्ट, HTTP/2 pseudo-header, डेवलपर टूल्स के General और Request Headers ब्लॉक, "Copy as fetch" स्निपेट या सिर्फ़ URL पढ़ता है
- Bash या zsh, PowerShell (curl.exe के रूप में) या Windows cmd.exe के लिए curl कमांड लिखता है, हर मान उस शेल की ज़रूरत के हिसाब से quote करके
- --data-raw से बॉडी को बाइट-दर-बाइट वैसा ही रखता है, ताकि शुरू का @ कभी फ़ाइल का नाम न समझा जाए, और -X GET सिर्फ़ तब लगाता है जब GET में बॉडी हो
- curl जो ख़ुद सेट करता है या जो रिक्वेस्ट बिगाड़ देगा — Host, Content-Length, Connection, Transfer-Encoding — उसे छोड़ता है और हर एक का कारण बताता है
- Cookie हेडर हटा सकता है, Authorization के मान छिपा सकता है, --compressed, -L या -k जोड़ सकता है, और हर विकल्प अलग लाइन में लिख सकता है
- बताता है कि क्या बदला और क्यों: मान लिया गया https://, [ ] या { } वाले URL के लिए -g, cmd.exe के लिए एक लाइन में किया गया JSON बॉडी, DevTools पेस्ट से हटाए गए रिस्पॉन्स हेडर
इनपुट और आउटपुट
इनपुट
- HTTP रिक्वेस्ट, DevTools हेडर या fetch() कॉल — रिक्वेस्ट टेक्स्ट के रूप में, 2 MB तक; "इनपुट फ़ॉर्मेट" पहचान लेता है कि वह क्या है, या आप ख़ुद चुनें।
- शेल और विकल्प — Bash या zsh, PowerShell या cmd.exe; हर विकल्प अलग लाइन में; --compressed, -L और -k; Cookie हेडर हटाना; Authorization के मान छिपाना।
आउटपुट
- curl कमांड — चुने गए शेल में पेस्ट करने, कॉपी या डाउनलोड करने के लिए तैयार।
- रिक्वेस्ट — मेथड, URL, HTTP वर्ज़न, पेस्ट कैसे पढ़ा गया, बॉडी का साइज़ बाइट में और शेल।
- हेडर — पेस्ट किया हर हेडर और वह कमांड में है, छोड़ा गया (कारण के साथ) या छिपे मान के साथ शामिल है।
- कमांड पर नोट्स और "चलाने से पहले" — कन्वर्टर ने क्या माना या बदला, और कमांड में क्या है।
HTTP रिक्वेस्ट से cURL कन्वर्टर का उदाहरण
टोकन, कुकी और बॉडी में apostrophe वाली JSON POST
इनपुट:
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"} (टूल का Load example), शेल 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 इसे URL से सेट करता है · Content-Length — छोड़ा गया: curl इसे बॉडी से गिनता है · Connection — छोड़ा गया: hop-by-hop, कनेक्शन curl संभालता है
कमांड पर नोट्स: रिक्वेस्ट में scheme नहीं, https मान लिया गया।HTTP रिक्वेस्ट से cURL कन्वर्टर के नतीजे कैसे पढ़ें
हेडर तालिका में "छोड़ा गया" जान-बूझकर है: Content-Length और Host curl ख़ुद गिनता है, Connection ख़ुद संभालता है, और --compressed चालू हो तो Accept-Encoding ख़ुद सेट करता है। कोई हेडर -H से वापस तभी जोड़ें जब सच में अलग मान चाहिए।
https मान लेने वाले नोट का मतलब है कि पेस्ट में scheme नहीं था; अगर सर्विस सादा HTTP चलाती है तो कमांड में URL को http:// कर दें।
PowerShell 7.3 वाला नोट त्रुटि नहीं है: 7.3 और बाद में PowerShell arguments अलग तरीके से भेजता है, और कमांड पुराने नियमों के हिसाब से quote की गई है।
cmd.exe के लिए बॉडी एक लाइन करने वाले नोट का मतलब है कि लाइन-ब्रेक सिर्फ़ JSON tokens के बीच से हटाए गए; हर मान जैसा लिखा था वैसा ही है।
HTTP रिक्वेस्ट से cURL कन्वर्टर कब इस्तेमाल करें
- डेवलपर टूल्स या प्रॉक्सी लॉग की फ़ेल रिक्वेस्ट टर्मिनल में दोहराना, ताकि उसे बग रिपोर्ट में शेयर किया जा सके।
- "Copy as fetch" स्निपेट को ऐसी कमांड में बदलना जो CI में या बिना ब्राउज़र वाले सर्वर पर चले।
- ऑपरेटिंग सिस्टम के बीच रिक्वेस्ट ले जाना: एक ही रिक्वेस्ट Bash, PowerShell और cmd.exe के लिए quote की हुई।
- कुकी हटाकर और Authorization के मान छिपाकर शेयर करने लायक़ कमांड तैयार करना।
समस्या निवारण
- "कोई रिक्वेस्ट लाइन नहीं मिली": पेस्ट METHOD /path, :method: या Request URL: के अलावा किसी चीज़ से शुरू होता है। रिक्वेस्ट को उसकी पहली लाइन से कॉपी करें, या fetch स्निपेट हो तो "fetch() कॉल" चुनें।
- "कोई होस्ट नहीं मिला": रिक्वेस्ट लाइन में सिर्फ़ पाथ है और Host हेडर नहीं। सर्वर के नाम के साथ Host: जोड़ें, या रिक्वेस्ट लाइन में पूरा URL पेस्ट करें।
- fetch() स्निपेट ठुकराया गया: उसके विकल्पों में variable, function, FormData या template string है। उसकी जगह डेवलपर टूल्स के Headers पैनल से raw रिक्वेस्ट पेस्ट करें।
- PowerShell 7.3 या बाद में कमांड quoting की त्रुटियों से फ़ेल होती है: पहले $PSNativeCommandArgumentPassing = "Legacy" चलाएँ, या WSL या Git Bash में Bash वाला रूप इस्तेमाल करें।
HTTP रिक्वेस्ट से cURL कन्वर्टर के बारे में अक्सर पूछे जाने वाले सवाल
कौन-से इनपुट फ़ॉर्मेट समझे जाते हैं?
Raw HTTP/1.1 रिक्वेस्ट (रिक्वेस्ट लाइन, हेडर, एक ख़ाली लाइन और बॉडी), absolute-form रिक्वेस्ट लाइन, HTTP/2 pseudo-header (:method, :path, :authority, :scheme), डेवलपर टूल्स का General ब्लॉक और उसके बाद रिक्वेस्ट हेडर (रिस्पॉन्स हेडर छोड़ दिए जाते हैं), literal विकल्पों वाली fetch(url, { … }) कॉल, और सिर्फ़ URL, जो GET बन जाता है।
PowerShell वाली कमांड curl.exe क्यों बुलाती है?
Windows PowerShell 5.1 में curl शब्द Invoke-WebRequest का alias है, जो अलग विकल्प लेता है, इसलिए कमांड curl.exe का नाम लेती है। इसकी quoting Windows PowerShell 5.1 और PowerShell 7.0 से 7.2 के लिए लिखी गई है; 7.3 और बाद में पहले $PSNativeCommandArgumentPassing = "Legacy" सेट करें, जैसा नतीजा बताता है।
क्या टोकन या कुकी वाली रिक्वेस्ट पेस्ट करना सुरक्षित है?
बदलाव आपके ब्राउज़र में होता है और कुछ भी भेजा नहीं जाता। पर कमांड में आपका पेस्ट किया हर हेडर रहता है, इसलिए जो भी इसे चलाए वह आपके नाम से काम करता है। शेयर करने से पहले "Cookie हेडर हटाएँ" और "Authorization के मान छिपाएँ" चुनें।
कमांड से कुछ हेडर ग़ायब क्यों हैं?
कुछ हेडर curl ख़ुद सेट करता है या वे रिक्वेस्ट बिगाड़ देते: Content-Length (बॉडी से गिना जाता है), URL के होस्ट जैसा Host, Connection और Transfer-Encoding जैसे hop-by-hop हेडर, --compressed चालू होने पर Accept-Encoding, और ऐसे नाम जो मान्य हेडर token नहीं हैं। हेडर तालिका हर एक का कारण बताती है।
cmd.exe वाला रूप इतना अलग क्यों दिखता है?
cmd.exe में backslash escape नहीं होता, वह quotes के अंदर भी %NAME% expand करता है और किसी argument के अंदर लाइन-ब्रेक नहीं भेज सकता। इसलिए ख़ास अक्षर ^ से escape होते हैं, हर % बेअसर किया जाता है, कई लाइनों का JSON बॉडी मान बदले बिना एक लाइन में किया जाता है, और बाक़ी बॉडी के लाइन-ब्रेक नोट के साथ हटा दिए जाते हैं।
तकनीकी नोट्स
HTTP/1.1 रिक्वेस्ट में रिक्वेस्ट लाइन, हेडर फ़ील्ड, एक ख़ाली लाइन और बॉडी होती है (RFC 9112); target कोई पाथ हो सकता है, होस्ट Host हेडर में, या पूरा URL। HTTP/2 यही हिस्से :method, :scheme, :authority और :path pseudo-header में ले जाता है (RFC 9113 §8.3), और ब्राउज़र HTTP/2 रिक्वेस्ट के लिए यही दिखाते हैं। Scheme न हो तो कन्वर्टर https मान लेता है और यह बताता है।
POSIX शेल (IEEE Std 1003.1, Shell Command Language §2.2) single quote के अंदर सब कुछ literal रखते हैं, इसलिए single quote को '\'' लिखा जाता है — बंद करें, escape किया quote, फिर खोलें। PowerShell double quote के अंदर $ और backtick expand करता है, इसलिए दोनों escape होते हैं, और फिर curl.exe argument को Microsoft C runtime के नियमों से पढ़ता है, इसी वजह से quote \`" बनते हैं। cmd.exe में quotes के अंदर कोई escape नहीं और %NAME% हर जगह expand होता है, इसलिए ख़ास अक्षर ^ से escape होते हैं और हर % बेअसर किया जाता है।
curl --data-raw को ठीक वैसा ही रिक्वेस्ट बॉडी बनाकर भेजता है, Content-Length ख़ुद सेट करता है, बॉडी होने पर POST पर चला जाता है (इसलिए बॉडी वाले GET को -X GET चाहिए), और -I से HEAD रिक्वेस्ट भेजता है। जिन हेडर का नाम RFC 9110 का token नहीं, और Connection व Transfer-Encoding जैसे hop-by-hop हेडर छोड़ दिए जाते हैं, क्योंकि कनेक्शन curl ख़ुद संभालता है। curl URL में [ ] और { } को range और list की तरह भी पढ़ता है (URL globbing), इसलिए URL में ये हों तो कन्वर्टर -g (--globoff) जोड़ता है और URL जैसा लिखा है वैसा ही जाता है।
सीमाएँ और कार्यप्रणाली
कन्वर्टर रिक्वेस्ट कभी नहीं भेजता: कमांड चलेगी या नहीं यह सर्वर, आपके नेटवर्क और उन बातों पर निर्भर है जो पेस्ट में नहीं थीं, जैसे JavaScript से सेट हुई कुकी या ख़त्म हो चुका सेशन।
Multipart फ़ॉर्म अपलोड, binary बॉडी और फ़ाइलें -F या @file विकल्पों में दोबारा नहीं बनाई जातीं; बॉडी --data-raw से टेक्स्ट के रूप में जाती है।
fetch() स्निपेट तभी पढ़े जाते हैं जब उनका URL और विकल्प literal हों; variables, FormData और template strings का मान नहीं निकाला जा सकता।
cmd.exe किसी argument के अंदर लाइन-ब्रेक नहीं भेज सकता और गैर-ASCII टेक्स्ट कंसोल code page से संभालता है, इसलिए कई लाइनों वाली बॉडी एक लाइन में की जाती है और गैर-ASCII टेक्स्ट के लिए chcp 65001 चाहिए हो सकता है।
सुरक्षा और गोपनीयता
बदलाव आपके ब्राउज़र में होता है: रिक्वेस्ट, उसके टोकन और कुकी कभी भेजे या सहेजे नहीं जाते। आप जो कमांड कॉपी करते हैं उसमें वे रहते हैं जब तक आप उन्हें न हटाएँ, इसलिए उसे पासवर्ड की तरह संभालें।
संदर्भ
- curl(1) — Linux manual pagecurl का हर विकल्प: -X, -H, --data-raw और --data-binary, -I, -L, -k और --compressed, और curl विकल्पों से मेथड कैसे चुनता है।
- Shell Command Language (IEEE Std 1003.1-2024)POSIX शेल का व्याकरण, जिसमें §2.2 Quoting शामिल है: single quote के अंदर सब कुछ literal क्यों रहता है और single quote ख़ुद कैसे लिखा जाता है।
- RFC 9112: HTTP/1.1HTTP/1.1 मैसेज सिंटैक्स: रिक्वेस्ट लाइन, हेडर फ़ील्ड, चंक्ड ट्रांसफ़र और कनेक्शन हैंडलिंग।