YamlBox

वेब और एन्कोडिंग · 5 मिनट पढ़ें

लाने के लिए कर्ल: अनुरोध को टर्मिनल से ब्राउज़र तक ले जाना

रूपांतरण प्राप्त करने के लिए एक कर्ल एक API के दस्तावेज़ से कामकाजी फ्रंटएंड कोड तक का सामान्य मार्ग है: API को समझने का सबसे तेज़ तरीका इसके डॉक्स से कॉपी किया गया एक कर्ल कमांड है, और इसे शिप करने का सबसे तेज़ तरीका `fetch` है। उनके बीच रूपांतरण ज्यादातर यांत्रिक है - एक विकल्प ऑब्जेक्ट पर फ़्लैग मैप - लेकिन दो चीजें नियमित रूप से अनुवाद को तोड़ती हैं: बॉडी एनकोडिंग और ब्राउज़र सुरक्षा मॉडल जिसका टर्मिनल में कोई समकक्ष नहीं है।

अद्यतन

झंडे कैसे मैप करते हैं

  • `-X POST` → `method: "POST"` (या `-d` से विधि का अनुमान लगाएं)।
  • `-H "Content-Type: application/json"` → `headers` में एक प्रविष्टि।
  • `-d '{"a":1}'` → `body: JSON.stringify(...)`; जब तक आप अन्यथा न कहें, कर्ल इसे फॉर्म-एन्कोडेड भेजता है।
  • `--data-binary @file` → एक डोरी के बजाय `Blob`, `FormData` या `ArrayBuffer` शरीर।
  • `-u user:pass` → `user:pass` के बेस64 से निर्मित एक `Authorization: Basic …` हेडर।
  • `-F name=@file` → `FormData` एक `File` के साथ, इस प्रकार फ़ाइल अपलोड व्यक्त किए जाते हैं।
                await fetch('https://api.example.com/v1/orders', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    Authorization: 'Bearer ' + token,
  },
  body: JSON.stringify({ sku: 'YB-1', qty: 2 }),
});
              

CORS: वह भाग जिसके बारे में कर्ल को कभी सोचना नहीं पड़ा

कर्ल ब्राउज़र के सुरक्षा मॉडल के बाहर चलता है, इसलिए यह उत्तर देने वाले किसी भी होस्ट को कॉल कर सकता है। `fetch` एक पृष्ठ CORS द्वारा बंधा हुआ है: सर्वर को आपकी उत्पत्ति की अनुमति देनी होगी, और साधारण अनुरोधों से परे किसी भी चीज़ के लिए इसे प्रीफ़्लाइट `OPTIONS` का सही उत्तर देना होगा। एक परिवर्तित कमांड जो टर्मिनल में पूरी तरह से काम करता है, ठीक इसी कारण से एक अपारदर्शी नेटवर्क त्रुटि के साथ ब्राउज़र में विफल हो सकता है - और अनुरोध में कोई भी हेडर संपादन इसे ठीक नहीं करेगा, क्योंकि अनुमति सर्वर से आनी होगी।

यदि CORS संदेश के साथ कोई फ़ेच विफल हो जाता है, तो समाधान API या आपके प्रॉक्सी पर है - जावास्क्रिप्ट में नहीं। समस्या से "बचने" के लिए क्लाइंट कोड में कभी भी API कुंजी डालकर काम न करें।

क्रेडेंशियल, रीडायरेक्ट और स्ट्रीमिंग

टर्मिनल से दो और व्यवहार भिन्न हैं। जब तक आप `credentials: "include"` पास नहीं कर लेते, कुकीज़ नहीं भेजी जातीं और सर्वर को वाइल्डकार्ड के बजाय स्पष्ट मूल के साथ प्रतिक्रिया देनी होगी। रीडायरेक्ट का पालन डिफ़ॉल्ट रूप से `redirect: "follow"` के साथ किया जाता है, लेकिन जब तक सर्वर इसे संभाल नहीं लेता, तब तक रीडायरेक्ट मूल में `Authorization` हेडर खो देता है, यही कारण है कि प्रमाणित कॉल के लिए अक्सर `redirect: "manual"` और एक जानबूझकर फ़ॉलो की आवश्यकता होती है। स्ट्रीमिंग प्रतिक्रियाओं को `response.body` से `ReadableStream` के रूप में पढ़ा जाता है, जहां कर्ल प्राप्त होने पर बस प्रिंट करता है।

फ़ेच या एक्सियोस?

`fetch` में बनाया गया है और हर जगह आधुनिक काम करता है; एक्सिओस सुविधा जोड़ता है - स्वचालित JSON पार्सिंग, इंटरसेप्टर, गैर-2xx प्रतिक्रियाओं के लिए एक पठनीय त्रुटि, पुराने रनटाइम में अपलोड प्रगति। एक परिवर्तित कर्ल कमांड किसी के लिए एक विश्वसनीय प्रारंभिक बिंदु है: जेनरेट किए गए विकल्पों को एक्सियोस कॉल में पेस्ट करें और हेडर और बॉडी अपरिवर्तित रहें।

लीक किए बिना कनवर्ट करें

वास्तविक सत्रों से कॉपी किए गए कर्ल कमांड में आमतौर पर लाइव बियरर टोकन, एपीआई कुंजी या सत्र कुकीज़ होती हैं। ब्राउज़र में चलने वाला रूपांतरण उन क्रेडेंशियल्स को आपकी मशीन पर रखता है, जो उस अनुरोध के साथ काम करने का एकमात्र समझदार तरीका है जिसे आपने स्वयं टाइप नहीं किया है।

लाने के लिए कर्ल - अक्सर पूछे जाने वाले प्रश्न

मेरा परिवर्तित फ़ेच अनुरोध CORS त्रुटि के साथ विफल क्यों हो जाता है?

क्योंकि ब्राउज़र समान-मूल नीति लागू करता है और कर्ल नहीं करता है। API को उचित `Access-Control-Allow-Origin` हेडर भेजना होगा और उड़ान-पूर्व अनुरोधों को संभालना होगा। जब कोई तृतीय-पक्ष API ब्राउज़र की उत्पत्ति की अनुमति नहीं देता है, तो अपने स्वयं के बैकएंड के माध्यम से प्रॉक्सी करना मानक समाधान है।

मैं JSON के बजाय फ़ेच के साथ फ़ॉर्म डेटा कैसे भेजूँ?

`FormData` ऑब्जेक्ट को बॉडी के रूप में उपयोग करें और ब्राउज़र को मल्टीपार्ट सीमा निर्धारित करने दें - `Content-Type` स्वयं सेट न करें, क्योंकि मान में ब्राउज़र द्वारा उत्पन्न सीमा टोकन शामिल है। इसमें `-F` फ़्लैग से फ़ाइल अपलोड भी शामिल हैं।

क्या फ़ेच डिफ़ॉल्ट रूप से कुकीज़ भेजता है?

नहीं, समान-मूल अनुरोधों में `credentials: "same-origin"` लागू होने पर कुकीज़ शामिल होती हैं, लेकिन क्रॉस-ओरिजिनल कॉल के लिए `credentials: "include"` की आवश्यकता होती है, और प्रतिक्रिया को पढ़ने के लिए सर्वर को वाइल्डकार्ड के बजाय एक स्पष्ट मूल के साथ प्रतिक्रिया देनी होगी।

इस पोस्ट में उल्लिखित उपकरण

19 टूल की पूरी सूची ब्राउज़ करें

पढ़ने के लिए और लेख

5 मिनट पढ़ें

URL एन्कोडिंग: कब बचना है, और कब आप चीज़ों को तोड़ रहे हैं

URL एनकोड और डीकोड सही ढंग से - आरक्षित वर्ण, प्लस बनाम %20, एनकोडयूआरआई बनाम एनकोडयूआरआईकंपोनेंट, और टूटे हुए लिंक के पीछे डबल-एन्कोडिंग बग।

5 मिनट पढ़ें

Base64 डिकोड और एनकोड: परिवहन के लिए, सुरक्षा के लिए नहीं

Base64 ब्राउज़र में डिकोड और एनकोड करें - 4/3 आकार नियम, पैडिंग, बेस 64url वैरिएंट और यूनिकोड बग जो डिकोड किए गए टेक्स्ट को कचरे जैसा बना देता है।

6 मिनट पढ़ें

JSON फ़ॉर्मेटर: सुंदर, छोटा, और वास्तव में मान्य

एक JSON फ़ॉर्मेटर जो सटीक त्रुटि स्थानों के साथ सुंदर-प्रिंट, छोटा और मान्य करता है - साथ ही लगभग हर अमान्य JSON त्रुटि के पीछे पाँच सिंटैक्स गलतियाँ।

सभी 19 पोस्ट →