← Back to JavaScript Course | Chapter 9: Async & Web APIs | Lesson 18 of 26

JS का JSONP

CORS के explicitly cross-origin AJAX requests की permission देने से पहले, developers JSONP (JSON with Padding) नाम का एक चालाक workaround इस्तेमाल करते थे -- इस बात का फायदा उठाते हुए कि <script> tags किसी भी domain से content load कर सकते हैं, उस समय के XMLHttpRequest के उलट। अब इसे एक legacy technique माना जाता है, जिसकी जगह ज़्यादातर CORS ने ले ली है, पर यह अभी भी पुराने code और कुछ third-party APIs में दिखता है।

JSONP क्यों मौजूद है

CORS से पहले, browsers JavaScript को किसी अलग domain पर cross-origin XMLHttpRequest बनाने से सख्ती से रोकते थे -- पर एक <script> tag को हमेशा किसी भी domain से एक script load करने की इजाज़त रही है, इसलिए JSONP उस loophole का फायदा उठाता है: "response" असल में ऐसे load होता है जैसे वह एक script file हो।

Note: JSONP को एक limitation (कोई CORS नहीं) के लिए एक historical workaround के रूप में समझें जो अब modern browsers और APIs में मौजूद नहीं -- उसी underlying समस्या का सही modern हल CORS है।
Warning: JSONP security-conscious CORS model से पहले का है, और इसकी technique ही (remote code execute करना) ठीक वही चीज़ है जिसे लापरवाही से होने से रोकने के लिए CORS design किया गया था।

उदाहरण: Why JSONP Exists

javascript
<script src="https://api.example.com/data?callback=handleData"></script>
<script>
  // Define the function `handleData` taking `data`
  function handleData(data) { console.log(data); }
</script>

JSONP कैसे काम करता है

Client एक global callback function define करता है और एक ऐसे URL के लिए request करता है जिसमें उस function का नाम एक query parameter के रूप में शामिल होता है -- server अपने JSON data को उसी exact function नाम की एक call में लपेट देता है, इसलिए जब returned "script" load होकर execute होता है, यह अपने आप आपके function को data को argument के रूप में देकर कॉल करता है।

Note: सुनिश्चित करें कि आपका callback function JSONP script tag के load होने की कोशिश करने से पहले define और globally accessible हो, वरना call "function not defined" error के साथ fail हो जाएगी।
Warning: request में callback function का नाम और वह नाम जिसमें server data लपेटता है, बिल्कुल मेल खाना चाहिए, वरना script के load होने पर कुछ नहीं होता।

उदाहरण: How JSONP Works

javascript
function handleData(data) {
  console.log("Received:", data);
}
// Server responds with: handleData({"name": "Sam"});
// which calls handleData automatically once the "script" loads

एक JSONP Request Dynamically बनाना

HTML में एक <script> tag hardcode करने के बजाय, JSONP requests आमतौर पर dynamically trigger होती हैं -- JavaScript से एक नया <script> element बनाना, उसका src target URL पर सेट करना, और उसे document में जोड़ना, जो तुरंत request शुरू कर देता है।

Note: अगर समय के साथ कई JSONP requests होनी हैं, तो dynamically बनाए गए script tag को load पूरा होने के बाद हटा दें (callback में, या किसी onload handler से) ताकि DOM साफ रहे।
Warning: एक dynamically बनाई गई JSONP request में fetch के .catch() जैसी failure detect करने की कोई built-in सुविधा नहीं है -- एक failed या blocked script load आपके callback को बस कभी न कॉल होने देकर छोड़ सकता है, बिना किसी सीधे error signal के।

उदाहरण: Dynamically Creating a JSONP Request

javascript
// Define the function `handleData` taking `data`
// Define the function `handleData` taking `data`
function handleData(data) { console.log(data); }
// Declare the constant `script`, set to `document.createElement("script")`
// Declare the constant `script`, set to `document.createElement("script")`
const script = document.createElement("script");
// Assign "https://api.example.com/data?callback=handleData" to `script.src`
// Assign "https://api.example.com/data?callback=handleData" to `script.src`
script.src = "https://api.example.com/data?callback=handleData";
// Call `document.body.appendChild(script)`
// Call `document.body.appendChild(script)`
document.body.appendChild(script);

JSONP की सीमाएं

JSONP सिर्फ GET requests support करता है, क्योंकि यह किसी URL को एक script के रूप में load करने पर निर्भर है -- POST body भेजने के लिए कोई equivalent नहीं है।

यह किसी failed request का पता लगाने का कोई साफ तरीका भी नहीं देता (कोई error callback standard नहीं है), और यह response को आपके page में असली, unrestricted JavaScript के रूप में execute करता है।

Note: JSONP को कभी भी एक साधारण, read-only GET request से आगे इस्तेमाल न करें, और सिर्फ तब जब target API असल में CORS support न करे।
Warning: चूंकि एक JSONP response आपके page के context में arbitrary JavaScript के रूप में execute होता है, इसे सिर्फ उन APIs और domains के खिलाफ इस्तेमाल करें जिन पर आप सच में भरोसा करते हैं -- एक malicious या compromised server इस channel से हानिकारक code चला सकता है।

उदाहरण: JSONP's Limitations

javascript
// JSONP limitations:
// - only supports GET (loading a URL as a script)
// - no built-in error callback if the request fails
// - executes the response as full, unrestricted JavaScript
console.log("Use CORS with fetch() instead when the API supports it.");

JSONP बनाम CORS: कब कौन सा इस्तेमाल करें

किसी भी API के लिए जिसे आप control करते हैं, या किसी भी modern third-party API के लिए, CORS सही, सुरक्षित विकल्प है -- यह server को explicitly बताने देता है कि कौन से origins इसे access कर सकते हैं, और HTTP methods की पूरी range और safer fetch API के साथ काम करता है।

JSONP सिर्फ उन पुराने APIs के लिए relevant रहता है जिन्होंने कभी CORS support नहीं जोड़ा।

Note: JSONP इस्तेमाल करने से पहले पहले जांचें कि कोई API CORS support करता है या नहीं -- ज़्यादातर modern public APIs करते हैं, जो JSONP को अनावश्यक बना देता है।
Warning: CORS उपलब्ध होने पर किसी नए integration के लिए JSONP चुनना बिना किसी असली फायदे के अनावश्यक security risk और GET-only limitations जोड़ता है।

उदाहरण: JSONP vs CORS: When to Use Which

javascript
fetch("https://api.example.com/data").then(r => r.json()).then(data => console.log(data));
console.log("Prefer CORS/fetch whenever the server supports it.");
Live Example
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
आम गलतियां
  1. target API के CORS support करते हुए भी आज किसी नए project के लिए JSONP इस्तेमाल करना -- JSONP में असली security downsides हैं और इसे सिर्फ तब इस्तेमाल किया जाना चाहिए जब CORS genuinely उपलब्ध न हो।
  2. यह भूल जाना कि JSONP सिर्फ GET requests support करता है, क्योंकि यह एक script load करके काम करता है, और scripts एक POST body नहीं ले जा सकतीं।
  3. यह न समझना कि JSONP remote server से arbitrary code सीधे आपके page के context में execute करता है, जो same-origin-protected JSON fetch के मुकाबले एक meaningful security consideration है।
चैप्टर सारांश
  • JSONP एक <script> tag को dynamically insert करके काम करता है जिसका src remote API की ओर point करता है, plain cross-origin XMLHttpRequest को block करने वाली same-origin restriction को दरकिनार करते हुए।
  • remote server अपने JSON data को client के specify किए गए callback function name की एक call में wrap करता है, जो script load होते ही automatically execute होती है।
  • JSONP सिर्फ GET requests support करता है और remote server के response को असली JavaScript की तरह execute करता है, एक असली security consideration।
ब्राउज़र सपोर्ट

JSONP सिर्फ basic <script> tag loading पर निर्भर करता है, जो web की सबसे शुरुआती दिनों से हर browser में supported है; यह CORS से पहले का है और अब काफी हद तक CORS से replace हो चुका है।

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.