كيف يمكنني استخدام JSONP لتنزيل كائنات JavaScript جانب العميل؟
-
19-09-2019 - |
سؤال
أحاول الحصول على كائنات جافا سكريبت من جانب العميل المحفوظة كملف محلي. لست متأكدا مما إذا كان هذا ممكنا.
الهندسة المعمارية الأساسية هي:
- بينغ API خارجي لإعادة كائن JSON
- عمل عميل العمل مع هذا الكائن، وفي النهاية لديه رابط "تنزيل لي"
- يرسل هذا الرابط البيانات إلى الخادم الخاص بي، والذي يعالجه ويرسله مرة أخرى مع نوع MIME
application/json
, ، والتي (يجب) مطالبة المستخدم بتنزيل الملف محليا.
الآن هنا القطع الخاصة بي:
الرمز جانب الخادم
<?php
$data = array('zero', 'one', 'two', 'testing the encoding');
$json = json_encode($data);
//$json = json_encode($_GET['']); //eventually I'll encode their data, but I'm testing
header("Content-type: application/json");
header('Content-Disposition: attachment; filename="backup.json"');
echo $_GET['callback'] . ' (' . $json . ');';
?>
رمز جانب العميل ذي الصلة
$("#download").click(function(){
var json = JSON.stringify(collection); //serializes their object
$.ajax({
type: "GET",
url: "http://www.myURL.com/api.php?callback=?", //this is the above script
dataType: "jsonp",
contentType: 'jsonp',
data: json,
success: function(data){
console.log( "Data Received: " + data[3] );
}
});
return false;
});
الآن عندما أزور api.php
موقع مع فايرفوكس، يطالب بتنزيل download.json
وهذا ينتج عنه هذا الملف النصي، كما هو متوقع:
(["zero","one","two","testing the encoding"]);
وعندما نقر #download
لتشغيل مكالمة AJAX، فإنها تسجل في Firebug
Data Received: testing the encoding
وهو ما هو تقريبا ما كنت أتوقعه. أنا أتلقى سلسلة JSON وتسلسلها، وهو أمر رائع. أنا أفتقد شيئين:
الأسئلة الفعلية
- ما الذي يجب علي فعله للحصول على نفس السلوك الفوري للتنزيل الذي أحصل عليه عند زيارة الصفحة في متصفح
- (أبسط بكثير) كيف يمكنني الوصول أو جانب الخادم أو كائن JSON الذي يتم إرساله إلى الخادم إلى Serialize IT؟ أنا لا أعرف ما هو الفهرس الموجود في صفيف الحصول على (سخيفة، وأنا أعلم، لكنني حاولت كل شيء تقريبا)
المحلول
- تحتاج إلى إخبار المتصفح بزيارة الصفحة، عادة عن طريق الإعداد
window.location
. - نظرا لأنها سلسلة، سيتم إرسالها كجزء من سلسلة الاستعلام الخام. حاول البحث
$_SERVER['QUERY_STRING']
لذلك.
لا تنتمي إلى StackOverflow