JSONP: ما هو، لماذا تم إنشاؤه، ولماذا حل محله CORS

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

JSONP: السلاح السري لمطوري الواجهات الأمامية في الماضي

\n

تخيل أنك مطور ويب في عام 2010. تحتاج إلى الحصول على بيانات من خادم آخر، مثل توقعات الطقس أو أسعار العملات. تكتب طلب fetch بسيطًا، ولكن في وحدة تحكم المتصفح يظهر خطأ أحمر: «لا يوجد رأس 'Access-Control-Allow-Origin'». هل يبدو ذلك مألوفًا؟

\n

هذه هي سياسة Same-Origin (سياسة المصدر نفسه) التي تمنع JavaScript الخاص بك من تجاوز النطاق الأصلي. ولكن كيف كانت تعمل أدوات الطقس، وأزرار «مشاركة»، وعدادات الزوار؟ الإجابة بسيطة: كانت تستخدم JSONP — وهي خدعة ذكية سنتحدث عنها اليوم.

\n

في هذه المقالة، سنجيب على السؤال الشائع من Stack Overflow: «ما هو JSONP، ولماذا تم إنشاؤه؟» — بلغة بسيطة، مع أمثلة كود وبدون نظرية زائدة.

\n\n

1. المشكلة: لماذا يحظر المتصفح الطلبات؟

\n

المتصفح مصاب بجنون الارتياب. إنه يحمي المستخدم من هجمات XSS وسرقة البيانات. سياسة Same-Origin تسمح لـ JavaScript بقراءة الردود فقط من نفس النطاق والبروتوكول والمنفذ.

\n

مثال على الحظر:

\n
// هذا الكود سيسبب خطأ CORS\nfetch('https://api.distant-server.com/data')\n  .then(response => response.json())\n  .then(data => console.log(data));
\n

ولكن هناك استثناء واحد: علامات <script>. المتصفح يقوم بتحميل البرامج النصية من أي نطاق بهدوء! هذه هي الثغرة التي يستخدمها JSONP.

\n\n

2. الحل: JSONP — JSON مع Padding

\n

JSONP (JSON with Padding) ليس تقنية ولا تنسيق بيانات، بل هو نمط (حل مؤقت) يتجاوز سياسة Same-Origin من خلال علامة <script>.

\n

الفكرة بسيطة: بدلاً من إجراء طلب عبر XMLHttpRequest، نقوم بإنشاء عنصر <script> ديناميكيًا، ونحدد عنوان URL للخادم، ويعيد الخادم ليس JSON، بل كود JavaScript يستدعي دالتنا مع البيانات.

\n\n

كيف يبدو JSON العادي:

\n
// رد الخادم (JSON عادي)\n{"name": "PythonLib", "topic": "JSONP"}
\n\n

كيف يبدو JSONP:

\n
// رد الخادم (JSONP)\nmyCallback({"name": "PythonLib", "topic": "JSONP"});
\n

الفرق هائل: في الحالة الثانية، يقوم الخادم بتغليف البيانات في استدعاء الدالة myCallback. هذا هو padding (الغلاف) المذكور.

\n\n

3. التطبيق العملي: كتابة طلب JSONP بنفسك

\n

لنقم بتنفيذ عميل JSONP باستخدام JavaScript الخالص. سيساعدنا هذا على فهم السحر.

\n\n
function jsonp(url, callbackName) {\n  // 1. إنشاء دالة عامة (استدعاء)\n  window[callbackName] = function(data) {\n    console.log('تم استلام البيانات:', data);\n    delete window[callbackName]; // التنظيف بعدنا\n    document.body.removeChild(script);\n  };\n\n  // 2. إنشاء علامة script\n  const script = document.createElement('script');\n  script.src = `${url}?callback=${callbackName}`; // تمرير اسم الاستدعاء\n  script.onerror = function() {\n    console.error('خطأ في تحميل JSONP');\n    delete window[callbackName];\n    document.body.removeChild(script);\n  };\n\n  // 3. الإضافة إلى DOM — المتصفح يقوم فورًا بتحميل وتنفيذ البرنامج النصي\n  document.body.appendChild(script);\n}\n\n// الاستخدام:\njsonp('https://api.example.com/data', 'handleData');
\n

كيف يعمل هذا خطوة بخطوة:

\n
    \n
  • نقوم بإنشاء دالة عامة handleData.
  • \n
  • نضيف علامة <script> مع عنوان URL للخادم. في عنوان URL، نمرر المعامل ?callback=handleData.
  • \n
  • الخادم الذي يدعم JSONP يرى المعامل callback ويعيد ليس JSON، بل JavaScript: handleData({...}).
  • \n
  • المتصفح ينفذ هذا البرنامج النصي، ويتم استدعاء دالتنا، ونحصل على البيانات.
  • \n
\n\n

4. لماذا JSONP شرير؟ (العيوب)

\n

إذا فكرت: «رائع، سأستخدمه في كل مكان» — توقف. JSONP له عيوب خطيرة:

\n
    \n
  • الأمان: أنت تثق بشكل أعمى في أي خادم. إذا تم اختراق الخادم، يمكنه تنفيذ أي كود في موقعك.
  • \n
  • لا يوجد معالجة للأخطاء: لا يمكنك معرفة ما إذا كان الطلب قد فشل (باستثناء المهلة الزمنية).
  • \n
  • GET فقط: JSONP يعمل فقط مع طلبات GET. لا يمكنك إرسال POST أو PUT أو DELETE.
  • \n
  • تلوث النطاق العام: يجب إنشاء دوال عامة، مما يزيد من خطر التعارضات.
  • \n
\n\n

5. الخلاصة: CORS — البديل الحديث

\n

اليوم، لا أحد يستخدم JSONP في المشاريع الجديدة. تم استبداله بـ CORS (Cross-Origin Resource Sharing) — وهو معيار رسمي للوصول إلى الموارد عبر النطاقات.

\n

بدلاً من الحيل باستخدام العلامات <script>، يقوم الخادم بإرجاع رأس Access-Control-Allow-Origin، ويقوم المتصفح بالتحقق منه. هذا أكثر أمانًا ومرونة.

\n\n

مثال على CORS (من جانب الخادم):

\n
// رأس HTTP من الخادم\nAccess-Control-Allow-Origin: https://my-site.com
\n

إذا كنت لا تزال بحاجة إلى دعم المتصفحات القديمة (Internet Explorer 8-9)، فقد يكون JSONP مفيدًا. ولكن في عام 2024، من الأفضل استخدام CORS أو وكيل الخادم.

\n\n

الاستنتاجات الرئيسية:

\n
    \n
  • JSONP هو حل مؤقت لتجاوز سياسة Same-Origin باستخدام علامة <script>.
  • \n
  • يعمل فقط مع طلبات GET ويتطلب ثقة في الخادم.
  • \n
  • تم استبدال JSONP بـ CORS — وهو معيار أكثر أمانًا وحداثة.
  • \n
  • إذا كنت مطورًا مبتدئًا، ادرس CORS بدلاً من JSONP.
  • \n
\n

نأمل أن تكون هذه المقالة قد ساعدتك في فهم JSONP. اترك أسئلتك في التعليقات!

المدونات

توصيات الكتب