جافا سكريبت - هل ترغب في الوصول إلى محتويات مجال آخر مع AJAX؟

StackOverflow https://stackoverflow.com/questions/1150208

  •  18-09-2019
  •  | 
  •  

سؤال

أحاول كتابة تطبيق JavaScript الذي يثبط البيانات من APSENTREETMAP API (http://wiki.openstreetmap.org/wiki/osm_protocol_version_0.6.)، والتي هي أساسا فقط API XML مريح. أحاول استخدام jQuery للوصول إلى XML. ومع ذلك أحصل على أخطاء أمنية. هذا هو حظر البرمجة النصية عبر الموقع.

كيف يمكنني الوصول إلى هذا XML؟ لا تقدم Afaik Osm JSONP، بحيث لا يعمل. هل هناك على أي حال؟>

هل كانت مفيدة؟

المحلول

يوضح لك وظيفة المدونة التي يرتبط بها دان كيفية حل هذه المشكلة، ولكن هذه هي الخلفية:

الطريقة الوحيدة التي يمكنك بها إجراء مكالمة جافا سكريبت عبر المجال من صفحة ويب هي عبر JSONP. إذا لم تكن قد تقدمت JSONP، فستضطر إلى اللجوء إلى استخدام برنامج نصي وكيل، حيث يمنع المستعرضات عن قصد من نصوص الموقع من إجراء هذه المكالمات.

لاحظ أنه إذا كنت تكتب ملحق فايرفوكس، فأنت تنفذه في مساحة مميزة، وبالتالي قادرة على جعل هذه المكالمات عبر المجال دون قيود.

نصائح أخرى

إن طريقتان للحصول على البرمجة البرمجة النصية عبر الإنترنت هي إعداد وكيل جانب الخادم لاستدعاء عنوان URL باستخدام البرنامج النصي الذي يتصل بروكسي جانب الخادم الخاص بك. والطريقة الأخرى هي استدعاء البيانات باستخدام علامة البرنامج النصي التي لا تحتوي على قيود على مكالمات الموقع عبر الموقع.

OpenStreetMap's Nominatim API الآن يدعم JSONP حتى تتمكن من الحصول على البيانات بحتة مع رمز جانب العميل، مع الحسب لا شيء إضافي على الخادم الخاص بك. هنا jsfiddle. مثال - إذا كنت تستطيع أن تفعل ذلك في JSfiddle، فيمكنك القيام بذلك في أي مكان.

بالنسبة للمسألة الأكثر عمومية حول كيفية الوصول إلى واجهات برمجة التطبيقات من المجالات الأخرى، إليك بعض الأشياء المفيدة التي تعلمتها أثناء التجديف من خلال العديد من الإجابات الكاملة جزئيا وغالبا ما تكون متناقضة هناك، ومن خلال التجربة والخطأ. يرجى التحرير أو التعليق إذا كان أي شيء أو يصبح غير دقيق.

  • إذا لم تتمكن من استخدام API يدعم JSONP، فأنت بحاجة إلى النظر في الإضافات jquery-xdomain-ajax باستخدام أشياء مثل yql. وفهم كيف يعملون. بشكل عام، يبدو أن هذه الإضافات موجهة لقراءة HTML أكثر من استعلام Apis.
  • لتكون قادرا على الوصول إلى API مباشرة، يجب أن يكون عرض النتائج في JSON و B) في دعم JSONP مما يعني: -
    • يجب إعداد API للاستماع إلى معلمة تخبره باسم الوظيفة لفه نتائجها
    • يجب عليك معرفة ما يسمى به هذه المعلمة. في حالة OSM، يطلق عليه json_callback, ، الافتراضي jQuery callback سوف يعمل فقط إذا كانت عن طريق الصدفة وهذا ما برمجة API للاستماع إليه
    • مع JQuery، هذا هو مفتاح المعلمة الخاصة بهذا API الذي يجب أن يذهب في نهاية عنوان URL للاستعلام الخاص بك ? (على سبيل المثال إذا كان ذلك json_callback, ، ومن بعد someurl.com/api?json_callback=?). أرقام jQuery خارج ما هذا هو، مقايضات ? للحصول على سلسلة مثل jQuery1712164863864387412, ، قم بأسماء الدالة المضمنة بنفس السلسلة، وينتظر تلقي بعض التعليمات البرمجية التي تشغذي هذه الوظيفة بالاسم ويمرره JSON.
      • إذا كان الطلب يعمل ولكن رد الاتصال لا ينطلق ويظهر خطأ مثل parseerror jQuery17109935275333671539_1300495251986 was not called, ، يعني ذلك jQuery لديه وظيفة تسمى، جاهزة والانتظار، لكن API لم يستخدم هذه السلسلة لفه json لذلك لا يتم استدعاء الوظيفة - من المرجح أن تعني أنك لا تستخدم اسم المعلمة الصحيحة
    • بدون JQuery، تحتاج إلى تمرير هذا المعلمة مفتاح اسم وظيفة المسماة التي ستتلقى JSON
  • نظرا لأن كل ما يحدث في الأساس هو تحميل المستعرض ثم في طريقة تسيطر عليها تشغيل مقتطف من رمز JavaScript يعادل someFunction({"some": "argument"});, ، معالجة الأخطاء محدودة (ولكن انظر JSfiddle لما تقدمه المسج إذا كنت تستخدم كامل $.ajax بناء الجملة بدلا من تجريد $.getJSON الاختصار)
  • في Firebug بالنسبة لي، لا تظهر طلبات JSONP على الأقل في وحدة التحكم مثل مكالمات AJAX الأخرى، بدلا من ذلك، إنها في أسفل لوحة NET (نظرا لأنها تحت غطاء محرك السيارة، فهي في الأساس طريقة تحميل مستديرة الرمز، التعامل مع المزيد مثل القول <script>).

نأمل أن يساعد هذا شخص ما!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top